0Pricing
Android Academy · レッスン

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. コルーチンの基礎とスコープ
  2. viewModelScopeとDispatcher
  3. Kotlin Flowの基礎
  4. StateFlowとSharedFlow
← Android Academyに戻る