我想在Dart中实现一个观察者模式,但我不确定如何去做.
假设我有一节课:
class MyClass {
String observed_field;
}
Run Code Online (Sandbox Code Playgroud)
现在,每当我更改字段时,我都想将"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");
}
}
Run Code Online (Sandbox Code Playgroud)
当然,现在,如果我没有一个,但很多这些领域,我不想创建所有那些getter和setter.明显的理论解决方案是将它们动态地添加到类中(不是工作代码,只是我希望它看起来的一个示例):
class MyClass
String _observeable_field;
String _observeable_field_2;
observe(#observeable_field, #observeable_field_2);
end
Run Code Online (Sandbox Code Playgroud)
它甚至可能吗?另外,如果没有在observe()
调用之上定义那些字段,那将是非常棒的,而是写下这样的内容:
observe(String: #_observeable_field, String: #_observeable_field_2);
Run Code Online (Sandbox Code Playgroud)
这样就可以自动声明这些字段.
这是使用Observe包执行此操作的方法.该示例取自该程序包中的代码注释(并适用于上面的示例).基本上,您使用注释注释要观察的字段@observable
,然后监听更改(通过调用触发的更改Observable.dirtyCheck()
;
首先,在您的.中添加可观察的包 pubspec.yaml
dependencies:
observe: any
Run Code Online (Sandbox Code Playgroud)
然后创建一个快速测试程序......
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!');
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
Changes to Hello World were: [#<PropertyChangeRecord Symbol("observedField") from: Hello to: Hello World>]
done!
Run Code Online (Sandbox Code Playgroud)
更新以响应评论...更新示例以省略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;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3444 次 |
最近记录: |