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

假设我有一门课:

class MyClass {

  String observed_field;

}

现在,每当我更改字段时,我都希望将"EATTED_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

Is it even possible?此外,如果不在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!

Update回应 comments ...

class MyClass2 extends Object with ChangeNotifier {

  String _observedField = "Hello";

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

  toString() => observedField;

}

Dart相关问答推荐

异类列表中函数类型不变性的解决方法

dart中如何从xpath获取属性值?

Dart 中的const关键字放置有什么不同?

如何在 Flutter 的 firebase_database 中执行事务?

如何在flutter中管理switch小部件的原生外观

如何在Flutter中制作视频缩略图?

flutter: 使用提供程序时,状态在热重载时丢失

GPS是否激活

如何计算列表中元素的出现次数

如何在flatter中使用SQFlite更新数据库表

在小部件构建期间,如何在Flutter中导航?

如何在 Flutter 中使用 Provider 显示来自 ChangeNotifier 的错误

如何使 FadeInImage 循环?

将符号转换为字符串

dart 是否支持运算符重载

是否有任何官方计划在 Google App Engine 上支持 Dart?

找不到名为pubspec.yaml的文件

Dart 中的 urlencoding

如何通过 Dart 中的值获取 Map 键?

判断dart中的字符串是否为数字