🎯

Dart Stream listen() メソッドの解説

2025/01/08に公開

概要

listen()メソッドは、Streamの基本的なメソッドで、Streamからデータを受信する際の最も基本的な方法です。他のすべてのStreamメソッドは、内部的にlisten()を使用して実装されています。

https://api.dart.dev/dart-async/Stream/listen.html

基本構文

StreamSubscription<T> listen(
  void Function(T event)? onData, {
  Function? onError,
  void Function()? onDone,
  bool? cancelOnError
});

パラメータ

  • onData: 各データイベントで呼び出される関数
  • onError: エラー発生時に呼び出される関数
  • onDone: ストリームが完了したときに呼び出される関数
  • cancelOnError: エラー発生時にサブスクリプションを自動的にキャンセルするかどうか

StreamSubscriptionの主な機能

  1. pause(): ストリームの一時停止
  2. resume(): 一時停止したストリームの再開
  3. cancel(): ストリームの購読をキャンセル
  4. asFuture(): サブスクリプションをFutureに変換

実践的なユースケース

  1. イベントハンドリング

    • ユーザーの入力監視
    • WebSocketからのメッセージ受信
    • ファイルの非同期読み込み
  2. 状態管理

    • アプリケーションの状態変更の監視
    • リアルタイムデータの更新
    • バックグラウンド処理の進捗監視
  3. エラーハンドリング

    • ネットワークエラーの処理
    • リトライロジックの実装
    • グレースフルデグラデーション

ベストプラクティス

  1. リソース管理

    • 使用後は必ずcancel()を呼び出す
    • dispose()メソッドでクリーンアップする
    • メモリリークを防ぐ
  2. エラーハンドリング

    • 適切なエラーハンドラを設定する
    • エラー発生時の動作を明確に定義する
    • リトライ戦略を実装する
  3. パフォーマンス

    • 必要なときだけ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