如何在dart中编写on-*事件/回调注册

How to write on-* event/callback registration in dart

本文关键字:事件 回调 注册 on- dart      更新时间:2023-09-26

我有一个JavaScript类,其中有一些事件,我需要将其重写为Dart。我不知道如何重写我们使用回调的部分。这是我的示例代码:

var Person = function (name) {
  this.name = name;
  this.onNameChangedCallbacks = [];
}
Person.prototype.onNameChanged = function(callback) {
  this.onNameChangedCallbacks.push(callback);
}
Person.prototype.setName = function (name) {
  this.name = name;
  this.onNameChangedCallbacks.forEach(function (callback){
    callback(name);
  });
}
var adam = new Person('Adam');
adam.onNameChanged(function(newName) {
  alert('New name is set to: ' + newName);
});
adam.setName('eva');
http://jsfiddle.net/R79Vy/

正如你所看到的,当name被改变的时候,所有注册的回调函数都会被调用新的name参数。如何在dart中编写这些代码?由于

如果是自定义事件

elem.on['name-changed'].listen((e) {
  // handle event
});

如果是DOM事件,通常有特定的getter,如

elem.onNameChanged.listen((e) {
  // handle event
});
// or
elem.onNameChanged.listen((e) =>  /* handle event (inline function body) */);

你也可以传递一个方法

elem.onNameChanged.listen(nameChangeHandler);
void nameChangeHandler(e) {
  // handle event
}

当您想要显式取消订阅(不依赖于垃圾收集)

import 'dart:async';
StreamSubscription nameChangeSubscr;
nameChangeSubscr = elem.onnameChanged.listen((e) => /* handle event */);
// unsubscribe
if(nameChangeSubscr != null) nameChangeSubscr.cancel();

如果你想要像DOM事件那样的自定义事件的getter我如何从聚合物Dart发射自定义事件?

更新

也许这就是你想要的

import 'dart:async';
class Person {
  Stream onNameChange;
  //StreamController _controller = new StreamController();
  StreamController _controller = new StreamController.broadcast();
  Person() {
    onNameChange = _controller.stream;
  }
  String _name;
  String get name => _name;
  set name(String val) {
    _name = val;
    _controller.add(val);
  }
}
void main() {
  var p = new Person();
  StreamSubscriptions nameChangeSubscr = p.onNameChange.listen((e) => print('name changed: $e'));

  var i = 0;
  new Timer.periodic(new Duration(milliseconds: 300), (Timer t) {
    if(i > 5) {
      t.cancel();
      if(nameChangeSubscr != 0) nameChangeSubscr.cancel();
    }
    p.name = "name ${i++}";
  });
}