FlutterやDartによるアプリ開発において、時間とともに変化する複数の非同期データを効率的に扱う仕組みが「Stream(ストリーム)」です。
Streamは「流れるデータ」のパイプラインであり、ボタンのタップイベントやネットワークのソケット受信など、あらゆる非同期イベントの監視に使われます。しかし、その強力さゆえにコンストラクタやメソッドが非常に多く、全体像を把握するのが難しいクラスでもあります。
本記事は、当ブログで解説しているDartの Stream 関連記事を分かりやすく体系化したロードマップ(ピラーページ)です。目的の機能を探すリファレンスマップとして、ぜひご活用ください!
Streamの基本概念
Streamを本格的に使いこなす前に、まずはその全体像や「シングルリスナー」と「ブロードキャスト」の違いといった基本用語を理解しておきましょう。
Streamオブジェクトを作る(コンストラクタ一覧)
Streamを新しく生成するための様々なコンストラクタです。定期的にデータを発生させるものから、単一のFutureやリストから変換するものまで用途に合わせて選べます。
- 基本コンストラクタ
➔ emptyコンストラクタ(空のストリーム) / errorコンストラクタ(エラーを送出するストリーム) / valueコンストラクタ(単一の値を送出) - 他のデータソースからの変換
➔ fromFutureコンストラクタ(単一FutureのStream化) / fromFuturesコンストラクタ(複数FutureのStream化) / fromIterableコンストラクタ(List等のコレクションのStream化) - 高度な生成コンストラクタ
➔ periodicコンストラクタ(一定間隔での繰り返し実行) / multiコンストラクタ(複数購読への柔軟なデータ配信) / eventTransformedコンストラクタ(低レベルなデータ変換)
Streamのメタ情報を取得する(プロパティ)
Streamに流れているデータの数や、最初のデータ、最後のデータなどの状態を参照するためのプロパティ群です。
流れてくるデータを変換・操作する(主要メソッド)
Streamに流れるデータを加工したり、特定のデータだけを絞り込んだり、別の形式に集計するための豊富なメソッドです。
データの「変換(マップ)」
- mapメソッド(各データの単純な加工・変換)
- asyncMapメソッド(非同期処理を伴うデータの変換)
- expandメソッド(1つのデータを複数のデータへ平坦化)
- asyncExpandメソッド(非同期でフラット展開・変換)
- transformメソッド(StreamTransformerによる高度な独自変換)
データの「抽出・絞り込み・スキップ」
- whereメソッド(条件に合うデータのみを通過させる)
- takeメソッド(指定した件数だけデータを受け取る) / takeWhileメソッド(条件を満たす間データを受け取り続ける)
- skipメソッド(指定した件数分データを読み飛ばす) / skipWhileメソッド(条件を満たす間のデータをスキップ)
- singleWhereメソッド(条件を満たす唯一のデータだけを抽出) / firstWhereメソッド(条件を満たす最初のデータを取得) / lastWhereメソッド(条件を満たす最後のデータを取得)
データの「受信と繰り返し処理」
データの「集計・判定・変換」
- toListメソッド(StreamのデータをListにまとめる) / toSetメソッド(重複を排除してSetに変換)
- reduceメソッド(前回の処理結果を引き継いでデータを1つに集約) / foldメソッド(初期値を指定してデータを集約)
- anyメソッド(条件を満たすデータが1つでもあるか判定) / everyメソッド(すべてのデータが条件を満たすか判定)
- containsメソッド(指定した要素がストリームに含まれているか判定)
- joinメソッド(データを結合して1つの文字列にする)
エラー制御・制御パイプ
- handleErrorメソッド(エラーを検知して安全に処理する)
- timeoutメソッド(データの到着遅延時のタイムアウト処理)
- pipeメソッド(別のStreamConsumerへデータを流し込む) / drainメソッド(データをすべて破棄して終了を待つ)
- distinctメソッド(連続する重複データを排除する) / castメソッド(Streamの型を安全にキャストする)
まとめ
Dartの Stream クラスは、アプリ内で非同期データフローを正確にコントロールするための極めて重要なパーツです。
これら多数のコンストラクタや操作用メソッドを適切に組み合わせることで、複雑なデータのフィルタリングや集計処理を、短く安全な宣言的コードとして美しく実装できます。開発時に迷った際は、このリファレンスマップをいつでも見返して最適なメソッドを見つけてください!


コメント