在 Dart 中实现观察者模式

2024-04-10

我想在 Dart 中实现观察者模式,但我不知道如何去做。

假设我有一堂课:

class MyClass {

  String observed_field;

}

现在,每当我更改字段时,我都想将“observed_fieldchanged”字符串打印到控制台中。使用自定义设置器非常简单:

class MyClass {

  String _observed_field;

  get observed_field    => _observed_field;
  set observed_field(v) {
    _observed_field = v;
    print("observed_field changed");
  }

}

当然,如果我没有一个字段,而是有很多字段,我就不想创建所有这些 getter 和 setter。显而易见的理论解决方案是将它们动态添加到类中,如下所示(不是工作代码,只是我希望它看起来如何的示例):

class MyClass

  String  _observeable_field;
  String  _observeable_field_2;

  observe(#observeable_field, #observeable_field_2);

end

有可能吗?此外,如果没有在上面定义这些字段,那就太棒了observe()调用,而是写如下内容:

observe(String: #_observeable_field, String: #_observeable_field_2);

这样这些字段就会自动声明。


这是一种使用以下方法来做到这一点的方法Observe http://api.dartlang.org/docs/channels/stable/latest/observe.html包裹。该示例取自该包中的代码注释(并适应上面的示例)。本质上,您可以使用以下方式注释您想要观察的字段@observable注释,然后监听更改(通过调用来触发)Observable.dirtyCheck();

首先,将 observable 包添加到您的pubspec.yaml

dependencies:
  observe: any

然后创建一个快速测试程序...

import 'package:observe/observe.dart';

class MyClass extends Object with Observable {
  @observable String observedField = "Hello";

  toString() => observedField.toString(); 
}

main() {
  var obj = new MyClass();

  // anonymous function that executes when there are changes
  obj.changes.listen((records) {
    print('Changes to $obj were: $records');
  });


  obj.observedField = "Hello World";

  // No changes are delivered until we check for them
  Observable.dirtyCheck();

  print('done!');
}

这会产生以下输出:

Changes to Hello World were: [#<PropertyChangeRecord Symbol("observedField") from: Hello to: Hello World>]
done!

Update回应评论... 更新示例以省略Observable.dirtyCheck()你可以使用 setter 和notifyPropertyChanged,与班级混在一起ChangeNotifier

class MyClass2 extends Object with ChangeNotifier {

  String _observedField = "Hello";

  @reflectable get observedField    => _observedField;
  @reflectable set observedField(v) {
    _observedField = notifyPropertyChange(#observedField, _observedField, v);    
  }

  toString() => observedField;

}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Dart 中实现观察者模式 的相关文章

随机推荐