🎯
Dart Stream listen() メソッドの解説
概要
listen()
メソッドは、Streamの基本的なメソッドで、Streamからデータを受信する際の最も基本的な方法です。他のすべてのStreamメソッドは、内部的にlisten()
を使用して実装されています。
基本構文
StreamSubscription<T> listen(
void Function(T event)? onData, {
Function? onError,
void Function()? onDone,
bool? cancelOnError
});
パラメータ
-
onData
: 各データイベントで呼び出される関数 -
onError
: エラー発生時に呼び出される関数 -
onDone
: ストリームが完了したときに呼び出される関数 -
cancelOnError
: エラー発生時にサブスクリプションを自動的にキャンセルするかどうか
StreamSubscriptionの主な機能
- pause(): ストリームの一時停止
- resume(): 一時停止したストリームの再開
- cancel(): ストリームの購読をキャンセル
- asFuture(): サブスクリプションをFutureに変換
実践的なユースケース
-
イベントハンドリング
- ユーザーの入力監視
- WebSocketからのメッセージ受信
- ファイルの非同期読み込み
-
状態管理
- アプリケーションの状態変更の監視
- リアルタイムデータの更新
- バックグラウンド処理の進捗監視
-
エラーハンドリング
- ネットワークエラーの処理
- リトライロジックの実装
- グレースフルデグラデーション
ベストプラクティス
-
リソース管理
- 使用後は必ず
cancel()
を呼び出す -
dispose()
メソッドでクリーンアップする - メモリリークを防ぐ
- 使用後は必ず
-
エラーハンドリング
- 適切なエラーハンドラを設定する
- エラー発生時の動作を明確に定義する
- リトライ戦略を実装する
-
パフォーマンス
- 必要なときだけlistenする
- 重い処理は別のIsolateで行う
- バッファリングを適切に設定する
example
import 'dart:async';
/// 睡眠時間の計測をするStream
Stream<int> sleepStream() async* {
final StreamController<int> stream = StreamController<int>();
// 初期値を定義
var count = 0;
// 5分経ったらストリームを閉じる想定
while (true) {
stream.add(count);
await Future.delayed(Duration(seconds: 1));
yield count++;
if (count >= 6) break; // 5分経ったらストリームを閉じる
}
stream.close(); // ストリームを閉じる
}
void main() {
final stream = sleepStream();
stream.listen((value) => print('睡眠時間:$value分'));
}
実行結果:
睡眠時間:0分
睡眠時間:1分
睡眠時間:2分
睡眠時間:3分
睡眠時間:4分
睡眠時間:5分
Discussion