在删除了StreamController.broadcast()的m4更新之后,我发现无法多次调用asBroadcastStream。这意味着您必须存储流,就像在Ugly类中一样,而不是像使用Pretty类一样使用getter。
这是设计,还是我做错了?
void main() {
Pretty p = new Pretty();
//This does not work.
p.onChange.listen((n) => print(n));
//This second call throws: "Bad state: Stream already has subscriber". Why?
p.onChange.listen((n) => print(n));
//This does work.
Ugly u = new Ugly();
u.onChange.listen((n) => print(n));
u.onChange.listen((n) => print(n));
}
class Pretty{
StreamController<int> _streamCtrl = new StreamController<int>();
Stream<int> get onChange => _streamCtrl.stream.asBroadcastStream();
}
class Ugly{
StreamController<int> _streamCtrl = new StreamController<int>();
Stream<int> _onChange;
Stream<int> get onChange => _onChange;
Ugly(){
_onChange = _streamCtrl.stream.asBroadcastStream();
}
}
答案 0 :(得分:1)
目前没有更好的方法可以做到。
以下是邮件列表中的帖子,其中包含更多信息:https://groups.google.com/a/dartlang.org/forum/#!searchin/misc/asBroadcastStream%7Csort:relevance/misc/KJrKH5-bNkU/CjpIpEP_EpgJ
在电子邮件中,我说:
使用r21499,我们删除了StreamController.broadcast构造函数。
StreamController.broadcast流具有令人讨厌的属性 很容易导致错过事件和类似的难以调试的条件。我们 最初为html库添加了这个类,但最终没有 需要它在那里。通过删除这个课程,我们可以更清洁 Streams的合同。我们仍然保留了asBroadcastStream方法。它的 行为略有不同,比一个人更健全 StreamController.broadcast。在大多数情况下,您可以尝试迁移到
asBroadcastStream
如果您需要附加多个侦听器。