StateFlow と mutableStateOf どちらを使うべきか
StateFlow と mutableStateOf はどちらも UI を再コンポーズさせる「状態ホルダー」 ですが、役割や使いどころに違いがあります。mutableStateOf(Compose 専用の状態)
Compose ライフサイクルに特化
mutableStateOf(value) で作った変数を更新すると、自動で Compose が再コンポーズされる
シンプルで軽量
ViewModel 内でちょっとした UI 状態を持つのに便利
Compose 以外では使いづらい
Flow と違って「監視」や「非同期ストリーム処理」には向かない
例
class TreeViewModel : ViewModel() {
var selectedFolder by mutableStateOf
private set
fun selectFolder(folder: Folder) {
selectedFolder = folder
}
}
UI 側
val folder = viewModel.selectedFolder
Text(folder?.name ?: "No Name")
StateFlow(Kotlin Flow の一種)
Compose 以外でも使える
Flow ベースなので Repository → UseCase → ViewModel → UI のような構成に強い
非同期やストリーム処理に対応
Room、DataStore、API など「流れてくるデータ」を扱える
UI では collectAsState() が必要
Flow を Compose に変換して監視する
例
class TreeViewModel : ViewModel() {
private val _selectedFolder = MutableStateFlow
val selectedFolder: StateFlow
fun selectFolder(folder: Folder) {
selectedFolder.value = folder
}
}
UI 側
val folder by viewModel.selectedFolder.collectAsState()
Text(folder?.name ?: "No Name")
違いを整理
特徴 mutableStateOf StateFlow
UI 反映 直接サポート collectAsState() 必要
対応範囲 Compose 専用 Kotlin 全般で使える
非同期ストリーム 不向き 得意
複数購読者 不可(UI専用) 可能(UI以外も購読できる)
データの重さ 軽量(UIローカル用) やや重い(グローバル共有向き)
結論
UI 専用の単純な状態(選択フォルダ、チェック状態など) → mutableStateOf がシンプルで良い
DB/ネットワーク/DataStore とつなぐストリームのような状態 → StateFlow が必須