在Dart中实现观察者模式



我想在Dart中实现一个观察者模式,但我不知道如何实现

假设我有一门课:

class MyClass {
  String observed_field;
}

现在,每当我更改字段时,我都希望将"observed_field-changed"字符串打印到控制台中。使用自定义设置器非常简单:

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包的方法。该示例取自该包中的代码注释(并根据您上面的示例进行了调整)。从本质上讲,您可以使用@observable注释来注释希望可观察的字段,然后监听更改(通过调用Observable.dirtyCheck()触发;

首先,在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!

更新以回应评论。。。更新示例以省略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;
}

最新更新