simple-web-system technology

Webに関する技術をシンプルに扱うブログ

Flutterのstream(bloc)を同期的に待ち受ける方法

結論

streamは非同期的に使うのが主な使い方だが、複数のstreamを扱うにあたって同期的に同期的に値を流したい時もある

stream1を処理した後に、stream2を処理みたいな

そういう時は、await forを使う

Future<int> getStreamInt(stream) async {
    var result;

    await for (final n in stream) {
        result = n;
        break;    
    }

    return n;
}

Blocでも使ってみる

これが活きるのがBlocを使ってる時

複数のBlocに対してEventを同期的に送信したい時とかに重宝する

以下はFlutter Blocを使った場合のコード

Future<int> getStreamInt(bloc) async {
    var result;

    await for (final n in bloc.stream) {
        result = n;
        break;    
    }

    return n;
}

注意点

blocの場合、2回連続同じstateはstreamに流れないようになっている。

そのため、期待したstreamの値がこなくて、永久にstreamを待ってしまうことがありうる

blocに関しては、待ち受ける時は値が変わることを確認すること