Kotlin コルーチン & Flow
Android および Kotlin Multiplatform プロジェクトにおける構造化並行性、Flow ベースのリアクティブストリーム、コルーチンテストのパターン。
アクティベートするタイミング
- Kotlin コルーチンで非同期コードを書く
- リアクティブデータに Flow、StateFlow、または SharedFlow を使用する
- 並行操作を処理する(並列読み込み、デバウンス、リトライ)
- コルーチンと Flow をテストする
- コルーチンスコープとキャンセルを管理する
構造化並行性
スコープ階層
常に構造化並行性を使用してください — GlobalScope は絶対に使わない:
並列分解
並列作業には coroutineScope + async を使用:
SupervisorScope
子の失敗が兄弟をキャンセルしてはならない場合は supervisorScope を使用:
Flow パターン
コールドフロー — ワンショットからストリームへの変換
UI 状態のための StateFlow
WhileSubscribed(5_000) は最後のサブスクライバーが離れてから 5 秒間アップストリームをアクティブに保ちます — 設定変更を再起動なしに生き延びます。
複数の Flow の結合
Flow オペレーター
ワンタイムイベント用の SharedFlow
ディスパッチャー
KMP では Dispatchers.Default と Dispatchers.Main(すべてのプラットフォームで利用可能)を使用してください。Dispatchers.IO は JVM/Android のみです — 他のプラットフォームでは Dispatchers.Default を使用するか DI で提供してください。
キャンセル
協調的キャンセル
長時間実行されるループはキャンセルを確認する必要があります:
try/finally でのクリーンアップ
テスト
Turbine を使った StateFlow のテスト
TestDispatcher でのテスト
Flow のフェイク
避けるべきアンチパターン
GlobalScopeの使用 — コルーチンがリークし、構造化キャンセルがない- スコープなしで
init {}内で Flow をコレクトする —viewModelScope.launchを使用 - ミュータブルコレクションで
MutableStateFlowを使用する — 常にイミュータブルコピーを使用:_state.update { it.copy(list = it.list + newItem) } CancellationExceptionをキャッチする — 適切なキャンセルのために伝播させる- コレクトするために
flowOn(Dispatchers.Main)を使用する — コレクションディスパッチャーは呼び出し元のディスパッチャー rememberなしで@Composable内にFlowを作成する — 再コンポジションのたびにフローが再作成される
参考
スキル: compose-multiplatform-patterns で Flow の UI 消費を参照。
スキル: android-clean-architecture でレイヤーにおけるコルーチンの役割を参照。


