🌬️

今更聞けないDartのStream

2025/02/17に公開

使う場面

Streamは主に以下のような状況で使用

  1. リアルタイムデータの監視
  • チャットアプリ
    • メッセージの監視例
  • SNSアプリ
    • いいね数やコメントの変更を監視
// データベースの変更を監視
Stream<List<TodoItem>> watchTodoItems() => select(todoItems).watch();

// ファイルの変更を監視
Stream<FileSystemEvent> fileChanges = file.watch();
  1. 継続的なイベント処理
  • フォーム入力のあるアプリ
    • 検索機能での入力監視
  • 音楽・動画プレイヤーアプリ
    • 再生状態の監視
// 検索機能での入力監視
Stream<String> searchQueryStream(TextEditingController controller) {
  return controller.stream
    .debounceTime(Duration(milliseconds: 300))
    .distinct()
    .where((text) => text.length > 2);
}
  1. 非同期データの連続的な更新
  • 地図・ナビゲーションアプリ
    • 現在位置の継続的な更新
  • 配送追跡アプリ
    • 配送状況の更新
// 位置情報の継続的な更新
Stream<Position> locationStream = Geolocator.getPositionStream();

// センサーデータの継続的な取得
Stream<AccelerometerEvent> accelerometerStream = accelerometerEvents;
  1. WebSocketやその他のリアルタイム通信
  • ライブストリーミングアプリ
    • コメントやリアクションのリアルタイム表示
  • 取引・オークションアプリ
    • リアルタイム価格更新
// コメントやリアクションのリアルタイム表示
class LiveStreamService {
  Stream<LiveComment> watchComments(String streamId) {
    return WebSocketChannel
      .connect(Uri.parse('wss://live.example.com/stream/$streamId'))
      .stream
      .map((data) => LiveComment.fromJson(data));
  }

  // 視聴者数の更新
  Stream<ViewerCount> watchViewerCount() {
    return socket.stream
      .where((event) => event['type'] == 'viewer_count')
      .map((event) => ViewerCount.fromJson(event));
  }
}
  1. 定期的な更新が必要な場合
  • ニュースアプリ
    • 定期的なニュース更新
  • 天気予報アプリ
    • 天気情報の定期更新
// 定期的なデータ更新
Stream.periodic(Duration(seconds: 1), (count) {
  // 1秒ごとに実行される処理
});

Streamの特徴:

  • 複数の値を時間をかけて非同期に提供
  • データの変更を監視し続ける
  • UIの自動更新に適している(StreamBuilder と組み合わせて使用)
  • メモリ効率が良い(必要なときだけデータを処理)

余談:
一方で、単一の結果だけを返す場合はFutureを使用する方が適切です。

Discussion