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

Posted

技术标签:

【中文标题】如何从事件侦听器内部将数据添加到同步广播 StreamController 到该控制器的 Stream?【英文标题】:How to add data to a synchronous broadcast StreamController from inside an event listener to that controller's Stream? 【发布时间】:2015-03-15 23:31:50 【问题描述】:

StreamController.broadcast()的文档中:

控制器将任何事件分发给所有当前订阅的 调用 [add]、[addError] 或 [close] 时的侦听器。 不允许在上一个之前调用addaddErrorclose 通话已返回

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

我尝试了一个似乎可行的解决方案,但我想了解此解决方案是否存在缺陷,或者是否有更好的解决方案。我正在使用中间方法将数据添加到流中。该方法使用在当前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】:

我很确定这与您的示例相同:

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

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

【讨论】:

以上是关于如何从事件侦听器内部将数据添加到同步广播 StreamController 到该控制器的 Stream?的主要内容,如果未能解决你的问题,请参考以下文章

如何将事件侦听器添加到多个按钮,每个按钮修改数据的不同部分

Kotlin 上的 Android:如何将数据从 Activity 传递到事件监听器?

如何将信息窗口添加到标记事件侦听器 [重复]

如何将事件侦听器添加到动画变换旋转?

如何正确地将事件侦听器添加到 React useEffect 挂钩?

如何将事件侦听器添加到本地反应原生通知