Dart中的this [x]等同于什么?

时间:2019-11-27 19:47:47

标签: dart

例如,在Javascript中,我可以执行以下操作:

class Foo {
  x = 'baz';

  bar() {
    const someVar = 'x';
    console.log(this[someVar]);
    // Output: 'baz';
  }
}

希望这是相对清楚的-归结为通过另一个变量的内容访问成员变量。在Dart中如何实现?

1 个答案:

答案 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);
  }
}