如何将数据从事件监听器内部添加到同步广播StreamController到该控制器的流?

时间:2015-03-15 23:31:51

标签: dart dart-async

StreamController.broadcast()的文档中:

  

控制器将所有事件分发给当前订阅的所有事件   调用[add],[addError]或[close]时的监听器。   在之前的版本之前,我们不允许致电addaddErrorclose   呼叫已经返回

我理解这种限制的必要性(至少对于同步广播流),但是我想以某种方式解决这个问题,因为触发其他事件的事件是我设计目标的核心(我对此有批评)这个设计,如果相关)。

我已经尝试了一个似乎有效的解决方案,但我想要了解这个解决方案是否有缺陷或是否有更好的解决方案。我正在使用中间方法将数据添加到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();
  });
}

谢谢!

1 个答案:

答案 0 :(得分:2)

我非常确定这与你的例子相同:

void broadcast(Event e) {
    new Future(() => _ctrl.add(e));
  });
}

不是同步添加到_ctrl,而是在事件队列上注册回调以进行添加。这是在上一次同步执行完成后执行的,所以这应该完全按照您的需要执行。