4

在 m4 更新后,StreamController.broadcast() 被删除,我发现 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();
  }
}
4

1 回答 1

2

目前没有更好的方法来做到这一点。

这是邮件列表中的主题,包含更多信息:https ://groups.google.com/a/dartlang.org/forum/#!searchin/misc/asBroadcastStream%7Csort:relevance/misc/KJrKH5-bNkU/CjpIpEP_EpgJ

在电子邮件中,我说:

使用 r21499,我们删除了 StreamController.broadcast 构造函数。

StreamController.broadcast 流具有令人讨厌的属性,很容易导致错过事件和类似的难以调试的情况。我们最初为 html-library 添加了这个类,但最终在那里不需要它。通过删除这个类,我们可以为 Streams 提供更清晰的合约。我们仍然保留 asBroadcastStream 方法。它的行为与 StreamController.broadcast 的行为稍有不同和更清醒。asBroadcastStream在大多数情况下,如果您需要附加多个侦听器,您可以尝试迁移到 。

于 2013-04-17T15:52:32.470 回答