[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回目のクリックでそれ以降のイベントの受信を停止するサンプルだ。


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

コメント

このブログの人気の投稿

nginxでlocalhostとしてアクセスをサーバーに転送する方法

Android・・・テキスト描画あれこれ, ascent(), descent()等

Android:stateに応じてTextの色を変更する・・・ColorStateList