[Dart]Stream.listenに2重のリスナ
DartのStreamのリスナ管理の話
Stream.listenを使ってリスナを貼るのだが、やればやるほどリスナが貼られていくよね。
new ButtonElement()
..onClick.listen( ()=> print("hoge") )
..onClick.listen( ()=> print("hoge") );
結果
>hoge
>hoge
これは、onClick呼び出し内でStream<T>がnewされるためだ。(EventStreamProvider.forTargetを内部で呼んでいる)
そして、listen()でさらにStreamSubscription<T>がnewされている。
実際にリスナを持つのは、このStreamSubscriptionで、こいつはリスナを一つしか持てない。
ということは、リスナは追加ではなく差し替えにしたい場合、こいつのonDataを書き換えてやれば良いわけだ。
ちなみに、StreamSubscription.cancel()を呼び出すことで、それ以降のイベントの配信を停止できる。
下のソースは、クリックされるたびにTextを変更し、2回目のクリックでそれ以降のイベントの受信を停止するサンプルだ。
参考:
Getting Your Feet Wet with Streams
Stream.listenを使ってリスナを貼るのだが、やればやるほどリスナが貼られていくよね。
new ButtonElement()
..onClick.listen( ()=> print("hoge") )
..onClick.listen( ()=> print("hoge") );
結果
>hoge
>hoge
これは、onClick呼び出し内でStream<T>がnewされるためだ。(EventStreamProvider.forTargetを内部で呼んでいる)
そして、listen()でさらにStreamSubscription<T>がnewされている。
実際にリスナを持つのは、このStreamSubscriptionで、こいつはリスナを一つしか持てない。
ということは、リスナは追加ではなく差し替えにしたい場合、こいつのonDataを書き換えてやれば良いわけだ。
ちなみに、StreamSubscription.cancel()を呼び出すことで、それ以降のイベントの配信を停止できる。
下のソースは、クリックされるたびにTextを変更し、2回目のクリックでそれ以降のイベントの受信を停止するサンプルだ。
ButtonElement btn = new ButtonElement();
StreamSubscription<Event> s = btn.onClick.listen( null );
s.onData( (e) {
btn.text = "first click";
s.onData( (e) { btn.text="second click";s.cancel(); } );
} );
参考:
Getting Your Feet Wet with Streams
コメント
コメントを投稿