asBroadcastStream不能多次调用

时间:2013-04-17 09:55:05

标签: dart

在删除了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();
  }
}

1 个答案:

答案 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如果您需要附加多个侦听器。