Dart Streamクラスのmultiコンストラクタについてメモ書き。
multiは複数のサブスクリプションを生成するコンストラクタ。複数のリスナーがStreamを受け取ることができるようになる。
multiはsingle-subscriptionとしても、broadcastとしても使用できる。single-subscriptionとbroadcastについては以下を参照の事。
multiコンストラタの第1引数にはvoid型のonListen()関数を渡す。onListen()の引数にはMultiStreamController<T>クラスを渡す。onListenはコールバック関数で、Streamがリッスンされるタイミングで新しいMultiStreamController<T>と共に呼び出される。MultiStreamController<T>にはadd()、close()等のメソッドが用意されている。Streamにデータを追加する場合にはadd()メソッドを、Streamを閉じる場合にはclose()メソッドを使用する。MultiStreamController<T>には他にもメソッドやプロパティが用意されており、詳細を知りたい方は公式サイトを参照して欲しい。
第2引数はbool型の名前付きオプション引数isBroadcast:でデフォルトはfalse。trueに設定するとStream.isBroadcastプロパティの値がtrueになるが、動作には影響しない。
それではコーディングで確認。
void main() {
List<int> item = [1, 2, 3];
final stream = Stream.multi(
(cntr) {
for (int i in item) {
cntr.add(i);
}
cntr.close();
},
isBroadcast: true,
);
// isBroadcastの値確認
print(stream.isBroadcast);
// リスナー1
stream.listen((event) {
print("リスナー1:$event");
});
// リスナー2
stream.listen((event) {
print("リスナー2:$event");
});
}
実行結果。
1行目はisBroadcastプロパティの値。
2行目以降はリスナー1とリスナー2の値。出力元のStreamは同じだが、それぞれのリスナーで出力結果を加工できる。
true
リスナー1:1
リスナー2:1
リスナー1:2
リスナー2:2
リスナー1:3
リスナー2:3
コメント