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

How to add data to a synchronous broadcast StreamController from inside an event listener to that controller's Stream?

StreamController.broadcast() 的文档中:

The controller distributes any events to all currently subscribed listeners at the time when [add], [addError] or [close] is called. It is not allowed to call add, addError, or close before a previous call has returned

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

我尝试了一种似乎有效的解决方案,但我想了解该解决方案是否存在缺陷,或者是否有更好的解决方案。我正在使用中间方法将数据添加到 Stream。该方法使用在当前 add 调用完成时完成的未来。这样,当一个事件侦听器广播一个事件时,它是 "queued" 直到调用当前正在添加的事件的所有其他处理程序。这似乎有效,但我真的很惊讶它确实如此,并且想知道是否有任何 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();
  });
}

谢谢!

我很确定这与您的示例一样:

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

它不是同步添加到 _ctrl,而是在事件队列上注册一个回调来执行添加。这是在上一个同步执行完成后执行的,因此这应该完全满足您的需要。