import 'dart:async';

void main() {
  var dog = new Dog();
  showTheDogACat(dog);
  print('outside');
  dog.bark();
}

class Cat{
  void runAway(msg){
    print("$msg I'm running away!");
  }
}

class Dog{
  var _barkController = new StreamController();
  Stream get onBark => _barkController.stream.asBroadcastStream();
  void bark(){
    _barkController.add("woof");
  }
}

showTheDogACat(dog){
  var cat = new Cat();
  dog.onBark.listen((event)=>cat.runAway(event));
  dog.onBark.listen((event)=>print(event));       //why Exception: Stream already has subscriber?
  print('inside');
  dog.bark();
}

为什么第二个 dog.onBark.listen 调用会生成异常:流已经有订阅者?我认为广播流可以有很多订阅者?

最佳答案

getter onBarkasBroadcastStream 上第二次调用 _barkController.stream 。新创建的广播流将尝试绑定(bind)到 _barkController.stream 但会失败,因为已经有一个监听器。

所以是的:广播流可能有多个监听器,但 asBroadcastStream 方法不能在单订阅流上多次调用。

一个解决方案是缓存第一个 asBroadcastStream 的结果。

关于stream - 为什么这个 Dart 广播流不接受多个监听调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16491069/

10-13 04:56