🌬️
今更聞けないDartのStream
使う場面
Streamは主に以下のような状況で使用
- リアルタイムデータの監視
- チャットアプリ
- メッセージの監視例
- SNSアプリ
- いいね数やコメントの変更を監視
// データベースの変更を監視
Stream<List<TodoItem>> watchTodoItems() => select(todoItems).watch();
// ファイルの変更を監視
Stream<FileSystemEvent> fileChanges = file.watch();
- 継続的なイベント処理
- フォーム入力のあるアプリ
- 検索機能での入力監視
- 音楽・動画プレイヤーアプリ
- 再生状態の監視
// 検索機能での入力監視
Stream<String> searchQueryStream(TextEditingController controller) {
return controller.stream
.debounceTime(Duration(milliseconds: 300))
.distinct()
.where((text) => text.length > 2);
}
- 非同期データの連続的な更新
- 地図・ナビゲーションアプリ
- 現在位置の継続的な更新
- 配送追跡アプリ
- 配送状況の更新
// 位置情報の継続的な更新
Stream<Position> locationStream = Geolocator.getPositionStream();
// センサーデータの継続的な取得
Stream<AccelerometerEvent> accelerometerStream = accelerometerEvents;
- 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));
}
}
- 定期的な更新が必要な場合
- ニュースアプリ
- 定期的なニュース更新
- 天気予報アプリ
- 天気情報の定期更新
// 定期的なデータ更新
Stream.periodic(Duration(seconds: 1), (count) {
// 1秒ごとに実行される処理
});
Streamの特徴:
- 複数の値を時間をかけて非同期に提供
- データの変更を監視し続ける
- UIの自動更新に適している(StreamBuilder と組み合わせて使用)
- メモリ効率が良い(必要なときだけデータを処理)
余談:
一方で、単一の結果だけを返す場合はFutureを使用する方が適切です。
Discussion