StateFlowとSharedFlow
アプリからリアクティブなStateを公開します
「StateFlowとSharedFlow」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全4レッスンが含まれています。
Hot Flow
coldなFlowとは異なり、StateFlowとSharedFlowはhotです。collectorとは独立して存在し、多くのcollectorで共有できます。
StateFlowは状態を保持する
StateFlowは常に現在の値を1つ保持します。新しいcollectorは、最新の値をすぐに受け取ります。UIの状態に最適です。
private val _count = MutableStateFlow(0)
val count: StateFlow<Int> = _count.asStateFlow()StateFlowを更新する
.valueを直接設定するか、読み取り・変更・書き込みをアトミックに行うupdateを使います。
_count.value++
// or, atomically:
_count.update { it + 1 }StateFlowの畳み込みと重複排除
StateFlowは最新の値だけを保持し(conflation)、新しい値が古い値と等しい場合は発行をスキップします。これにより、不要なUI更新を避けられます。
イベントにはSharedFlowを使う
SharedFlowには必須の現在値がなく、過去に発行された値を設定可能な数だけreplayできます。画面遷移やsnackbarの表示などの1回限りのイベントに適しています。
private val _events = MutableSharedFlow<String>()
val events: SharedFlow<String> = _events.asSharedFlow()イベントを発行する
コルーチンからSharedFlowに値を発行します。
fun onSave() {
viewModelScope.launch {
_events.emit("Saved!")
}
}イベントにStateFlowを使わない理由
StateFlowは最後の値を保持するため、再購読したcollector(画面回転後など)は古いイベントを再び受け取り、画面遷移が2回発生する可能性があります。SharedFlowはデフォルトではreplayしないため、この問題を避けられます。
SharedFlowを設定する
replayとextraBufferCapacityを調整して、バッファリングとバックプレッシャーの動作を制御します。
MutableSharedFlow<String>(
replay = 0,
extraBufferCapacity = 1
)Cold FlowをStateFlowに変換する
stateInを使って、coldな上流FlowをViewModelのscopeに関連付けられた共有StateFlowに変換します。
val uiState = repo.stream()
.stateIn(
viewModelScope,
SharingStarted.WhileSubscribed(5000),
UiState()
)使い分け
- StateFlow → 現在の画面状態(常に値があります)。
- SharedFlow → 一時的なイベント(1回だけ発生します)。
両方をcollectする
ComposeではcollectAsStateWithLifecycleでStateFlowをcollectし、SharedFlowのイベントはLaunchedEffect内でcollectして1回だけ処理します。
LaunchedEffect(Unit) {
vm.events.collect { msg -> showSnackbar(msg) }
}クイックチェック
StateFlow と SharedFlow の理解度を確認しましょう。
まとめ
学んだこと:
- StateFlow は、現在の値を持つホットな状態ホルダーで、値をまとめて扱います。
- SharedFlow は、リプレイ回数を設定できるホットなイベントストリームです。
- 状態には StateFlow、一度だけ発生するイベントには SharedFlow を使用します。
stateInはコールドフローを StateFlow に変換します。
よくある質問
「StateFlowとSharedFlow」レッスンは無料ですか?
はい。「StateFlowとSharedFlow」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全4レッスンが含まれています。
「StateFlowとSharedFlow」で何を学びますか?
アプリからリアクティブなStateを公開します ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Android Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「StateFlowとSharedFlow」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このAndroid Academyレッスンでコードを書いて実行できますか?
はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- コルーチンの基礎とスコープ
- viewModelScopeとDispatcher
- Kotlin Flowの基礎
- StateFlowとSharedFlow