如何从事件侦听器内部将数据添加到同步广播 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] 时的侦听器。 不允许在上一个之前调用
add
、addError
或close
通话已返回
我理解这个限制的必要性(至少对于同步广播流),但是我想以某种方式解决这个问题,因为触发其他事件的事件是我设计目标的核心(我愿意批评此设计(如果相关)。
我尝试了一个似乎可行的解决方案,但我想了解此解决方案是否存在缺陷,或者是否有更好的解决方案。我正在使用中间方法将数据添加到流中。该方法使用在当前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 传递到事件监听器?