【问题标题】:Getter and setter extension methodsGetter 和 setter 扩展方法
【发布时间】:2021-06-28 21:17:26
【问题描述】:

如何按以下方式添加 getter 和 setter 扩展方法?以下内容不起作用,因为未定义 _foo 并且直接设置为 foo 就像 set foo(val) => foo = val; 一样会创建一个无限循环。

extension on Uri {
  String get foo => _foo;
  set foo(val) => _foo = val;
}

main() {
  var uri = Uri();
  uri.foo = 'bar';
}

【问题讨论】:

  • 这实际上与 getter/setter 方法没有任何关系。 any 扩展方法会有同样的问题。从根本上说,您的问题是您想将数据成员添加到对象instance,但这不是静态扩展方法可以做到的。您也许可以让您的方法在某个全局 Expando 实例上查找 this,但请务必阅读有关使用 Expando 的注意事项。

标签: dart extension-methods getter-setter


【解决方案1】:

如果你想在Uri 对象上存储数据,你需要一个地方来存储它。 您不能声明扩展字段因为扩展不会更改它们扩展的类,因此它们不能为对象添加存储空间。

你可以做的是使用Expando:

extension on Uri {
  static final _storage = Expando<String>();
  String get foo => _storage[this];
  set foo(String value) {
    _storage[this] = value;
  }
}

Expando 旨在为任何对象添加“侧面”存储,而不会在对象被垃圾回收时泄漏存储。 (您不能使用它来存储字符串、数字、布尔值或null 上的值,因为它们是特殊的 wrt.identity,因为您可以从 literals 中创建它们,...并且因为在 JavaScript它们不是真实的物体)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-14
    • 2017-09-09
    • 1970-01-01
    • 2013-05-24
    • 2017-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多