在StreamController.broadcast()
的文档中:
控制器将所有事件分发给当前订阅的所有事件 调用[add],[addError]或[close]时的监听器。 在之前的版本之前,我们不允许致电
add
,addError
或close
呼叫已经返回
我理解这种限制的必要性(至少对于同步广播流),但是我想以某种方式解决这个问题,因为触发其他事件的事件是我设计目标的核心(我对此有批评)这个设计,如果相关)。
我已经尝试了一个似乎有效的解决方案,但我想要了解这个解决方案是否有缺陷或是否有更好的解决方案。我正在使用中间方法将数据添加到Stream。该方法使用在当前add
调用完成时完成的未来。通过这种方式,当事件监听器广播事件时,它将“排队”,直到调用添加的当前事件的所有其他处理程序。这似乎有效,但我真的很惊讶它,并且我想知道是否有任何Dart专家可以在其中挖洞或让我知道是否有更好的方法。
以下是代码:
// Instance field... starts off complete on initialization
Completer _broadcasting = new Completer()..complete();
void broadcast(Event e) {
_broadcasting.future.then((_) {
_broadcasting = new Completer();
_ctrl.add(e);
_broadcasting.complete();
});
}
谢谢!
答案 0 :(得分:2)
我非常确定这与你的例子相同:
void broadcast(Event e) {
new Future(() => _ctrl.add(e));
});
}
不是同步添加到_ctrl
,而是在事件队列上注册回调以进行添加。这是在上一次同步执行完成后执行的,所以这应该完全按照您的需要执行。