在Dart中实现Observer模式

我想在Dart中实现一个观察者模式,但我不确定如何去做.

假设我有一节课:

class MyClass {

  String observed_field;

}

现在,每当我更改字段时,我都想将“observe_field changed”字符串打印到控制台中.使用自定义setter非常简单:

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中添加observable包

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;

}
相关文章
相关标签/搜索