例如,在Javascript中,我可以执行以下操作:
class Foo {
x = 'baz';
bar() {
const someVar = 'x';
console.log(this[someVar]);
// Output: 'baz';
}
}
希望这是相对清楚的-归结为通过另一个变量的内容访问成员变量。在Dart中如何实现?
答案 0 :(得分:0)
这在Dart中并不简单。 Dart没有使用[]
访问类属性的语法。
不过有两种方法:
镜像:
https://api.dartlang.org/stable/2.6.1/dart-mirrors/dart-mirrors-library.html
基本上,您可以使用所有内容并提供最大的自由度。您可以检查类具有的属性,可以通过名称访问它们,等等。最大的缺点是,生成的JS(如果定位到网络)将非常庞大。 Flutter根本不支持它。
可反射
要处理生成的大型JS,可以使用package:reflectable。从未尝试过Flutter。设置并开始使用它的功能还需要更多。
仅飞镖解决方案1
您可以在类上重载[]
运算符:
class Foo {
final _backing = <String, String>{
'foo': 'bar'
};
operator [](String val) {
return _backing[val];
}
}
void main() {
final inst = Foo();
print(inst['foo']);
}
仅飞镖解决方案2
只需使用一个地图:)很好的...如果您要处理复杂类型,并且想为地图添加一些额外的功能,则可以执行以下操作:
import 'dart:collection';
class StringMap extends Object with MapMixin<String, String> {
final _backing = <String, String>{};
@override
String operator [](Object key) {
return _backing[key];
}
@override
void operator []=(String key, String value) {
_backing[key] = value;
}
@override
void clear() {
_backing.clear();
}
@override
Iterable<String> get keys => _backing.keys;
@override
String remove(Object key) {
return _backing.remove(key);
}
}