7
import 'dart:async';

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

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

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

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

2 番目の呼び出しで例外が生成されるのはなぜdog.onBark.listenですか: ストリームには既にサブスクライバーがありますか? ブロードキャストストリームには多くのサブスクライバーがいると思いましたか?

4

1 に答える 1

12

ゲッターは、 で 2 回目のonBark呼び出しを行います。新しく作成されたブロードキャスト ストリームは にバインドしようとしますが、リスナーが既に存在するため失敗します。asBroadcastStream_barkController.stream_barkController.stream

はい: ブロードキャスト ストリームには複数のリスナーが含まれる場合がasBroadcastStreamありますが、単一のサブスクリプション ストリームでメソッドを複数回呼び出すことはできません。

1 つの解決策は、最初の の結果をキャッシュすることですasBroadcastStream

于 2013-05-10T21:32:04.647 に答える