如何将数据从事件侦听器内部添加到同步广播 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
,而是在事件队列上注册一个回调来执行添加。这是在上一个同步执行完成后执行的,因此这应该完全满足您的需要。
在 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
, orclose
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
,而是在事件队列上注册一个回调来执行添加。这是在上一个同步执行完成后执行的,因此这应该完全满足您的需要。