
Jetpack Composeにおいて、Composeの「状態(State)」と「非ComposeのAPI(Flowなど)」を連携させたい場合に snapshotFlow が非常に有効です。
具体的には、以下のようなケースで使用します。
🧑🏻💻 1. Composeの状態変化をFlowとして監視したいとき
Composeの State オブジェクトの値が変化したタイミングで、何らかの副作用(Side-effect)を起こしたい場合に使用します。
コード例:TextFieldの入力値を監視して検索APIを呼ぶ
LaunchedEffect(textState) {
snapshotFlow { textState.value }
.debounce(300L) // 300ms入力が止まったら処理
.distinctUntilChanged()
.collect { query ->
viewModel.search(query)
}
}
🧑🏻💻 2. 非ComposeのAPIと値を同期させたいとき
Composeの管理外にあるライブラリやシステムAPIに対し、Compose側の状態の変化を伝えたい場合です。
コード例:スクロール位置をトラッキングツールへ送信
LaunchedEffect(listState) {
snapshotFlow { listState.firstVisibleItemIndex }
.filter { it > 0 }
.collect { index ->
Analytics.log("ScrollPosition", index)
}
}
🧑🏻💻 3. 複雑な条件で「状態の変化」をトリガーにしたいとき
LaunchedEffect は状態が更新されるたびに毎回実行されますが、snapshotFlow を使うと、
Flowの演算子(filter, distinctUntilChanged など)を組み合わせる
ことで、「特定の値になったときだけ」といった細かい条件付けが容易になります。
🧑🏻💻 注意点:使うべきではないケース
すべての状態監視に snapshotFlow を使う必要はありません。
- 単純なUIの更新: 単にComposeのUIを再描画したいだけであれば、snapshotFlow を使わず、Composeの State をそのまま読み取ってUIを構成するのが最も効率的です。
- 計算処理: 高負荷な計算をFlowの中で行う場合は、適切なスレッド(Dispatchers.Defaultなど)で処理を行うよう注意が必要です。
🧑🏻💻 まとめ
snapshotFlow は、
「Composeのリアクティブな状態」を「Kotlin Flowの強力な演算子」とブリッジさせるためのツール
です。
「状態が変化した時に、何か別のアクション(通信、ログ記録、画面遷移など)を発生させたい」と考えたときが、この機能の使いどころです。
🧑🏻💻 参考
Related Categories : Android・JetpackCompose・Kotlin・Recommended・streaming・Trending