我想在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;
}