Y&S SoftWareのホームページ
使いかってのいいソフトウェアを開発します

StateFlow と mutableStateOf どちらを使うべきか

StateFlow と mutableStateOf はどちらも UI を再コンポーズさせる「状態ホルダー」 ですが、役割や使いどころに違いがあります。

mutableStateOf(Compose 専用の状態)

Compose ライフサイクルに特化
mutableStateOf(value) で作った変数を更新すると、自動で Compose が再コンポーズされる
シンプルで軽量
ViewModel 内でちょっとした UI 状態を持つのに便利

Compose 以外では使いづらい
Flow と違って「監視」や「非同期ストリーム処理」には向かない


class TreeViewModel : ViewModel() {
  var selectedFolder by mutableStateOf(null)
    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(null)
  val selectedFolder: StateFlow = _selectedFolder

  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 が必須