dart - 从聚合物 Dart 观察包装

标签 dart dart-polymer

我正在尝试使用观察包,而无需在模型中添加注释,而只需在 setter 中引发notifyPropertyChange,因此为了测试我进行了以下测试

import 'package:observe/observe.dart';
import 'dart:async';
import 'dart:math';
void main() {

  var dummyWatchingModel = new DummyWatchingModel();
  new Timer.periodic(new Duration(milliseconds:1000), (_){
           //calls a function that set a random value to the property in the observable model
           dummyWatchingModel.setModelProps();
      });
}

class Model extends Observable{
  int _x;
  Model(this._x);

  int get x=> _x;
  void set x(int value){
    _x = notifyPropertyChange(#_x, _x, value);
  }
}

class DummyWatchingModel{
  Model model = new Model(1); 
  final rng = new Random(); 
  anotherModel(){

    //watch for changes in model instance properties
    this.model.changes.listen((List<ChangeRecord> records) {
      for(ChangeRecord change in records){
        print(change.toString());
      }
    });
  }

  //the callback for the timer to assign a random value model.x
  setModelProps(){
    model.x = rng.nextInt(100);
    print('called...');
  }
}

我正在使用引发 notifyPropertyChange 的 setter 来更改 Model 实例中的属性值,但它从不监听更改,知道为什么吗?

最佳答案

我认为您想使用ChangeNotifier而不是Observable

我不确定 notifyPropertyChange,但对于 Observable,您通常需要调用 dirtyCheck 来获取有关更改的通知。

我不久前做了一个小例子来了解这两者是如何工作的:

import 'package:observe/observe.dart';

class Notifiable extends Object with ChangeNotifier {
  String _input = '';

  @reflectable
  get input => _input;

  @reflectable
  set input(val) {
    _input = notifyPropertyChange(#input, _input, val + " new");
  }

  Notifiable() {
    this.changes.listen((List<ChangeRecord> record) => record.forEach(print));
  }
}

class MyObservable extends Observable {
  @observable
  String counter = '';

  MyObservable() {
    this.changes.listen((List<ChangeRecord> record) => record.forEach(print));
  }
}

void main() {
  var x = new MyObservable();
  x.counter = "hallo";
  Observable.dirtyCheck();

  Notifiable notifiable = new Notifiable();
  notifiable.input = 'xxx';
  notifiable.input = 'yyy';
}

关于dart - 从聚合物 Dart 观察包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24276737/

相关文章:

session - 如何从 Dart HttpServer WebSocket 访问 HttpSession 数据?

dart - 如何从选择事件中获取选定菜单项的纸张菜单按钮

dart - 指示需要一个下拉菜单

flutter - 在 flutter 中更新 android studio 后出错

dart - 如何在 Polymer.dart 中的自定义元素内注册 PolymerExpression 过滤器?

dart - 内部错误: 'http://localhost:63342/epimss_polymer_app/web/index.dart':格式错误的类型:行37 pos 42465:尚未加载 'prefix16.property'类型

dart - 在 Polymer 中对列表进行分组而不重绘整个 DOM

firebase - 离线使用。 Flutter Hamilton 应用架构。写入节点并期望云函数更新数据库,然后监听更新 UI

list - 根据条件从 Dart 中的对象列表中返回一个值

memory-leaks - Dart/Flutter 有弱引用的概念吗?