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

UIでDataStoreを利用する

DataStoreを利用するための流れを説明します。

インスタンス化 → 値の保存 → 値の取得 → UIで使う流れ

1.
インスタンス化

AppSettings は Context が必要なので、通常は Activity や ViewModel で作ります。

// MainActivity.kt など
val settings = AppSettings(this)


もし ViewModel から使う場合は、Application コンテキストを渡します。

class SettingsViewModel(application: Application) : AndroidViewModel(application) {
  private val settings = AppSettings(application)

  // Flow を公開
  val selectedFolderId = settings.selectedFolderId
  val expandedFolderIds = settings.expandedFolderIds

  suspend fun saveSelectedFolder(id: Int) {
    settings.setSelectedFolderId(id)
  }
}



2.
保存方法(書き込み)

DataStore は suspend 関数で保存するので、CoroutineScope(ViewModelScope や LaunchedEffect 内)で呼び出します。

// フォルダ選択時に保存
viewModelScope.launch {
  settings.setSelectedFolderId(10)
}


展開フォルダ一覧を保存する場合:

viewModelScope.launch {
  settings.setExpandedFolderIds(setOf(1, 2, 3)) // フォルダID 1,2,3 を展開中として保存
}



3.
データ取得(読み込み)

DataStore は Flow を返すので、購読して値を受け取ります。
UI層(Compose)なら collectAsState() を使うのが定番です。

@Composable
fun MainScreen(viewModel: SettingsViewModel) {
  val selectedFolderId by viewModel.selectedFolderId.collectAsState(initial = -1)
  val expandedFolders by viewModel.expandedFolderIds.collectAsState(initial = emptySet())

  Text(text = "選択中のフォルダ: $selectedFolderId")
  Text(text = "展開中: $expandedFolders")
}



4.
起動時に前回の状態を復元

Compose では LaunchedEffect を使って、初回表示時に1回だけ処理できます。

@Composable
fun MainScreen(viewModel: SettingsViewModel, treeViewModel: TreeViewModel) {
  val selectedFolderId by viewModel.selectedFolderId.collectAsState(initial = -1)
  val expandedFolders by viewModel.expandedFolderIds.collectAsState(initial = emptySet())

  // 起動時1回だけ実行
  LaunchedEffect(Unit) {
    if (selectedFolderId != -1) {
      treeViewModel.selectFolder(selectedFolderId)
      treeViewModel.setNoteTitles(selectedFolderId)
    }
    treeViewModel.setExpandedFolders(expandedFolders)
  }

  // UI表示部分 ...
}



5.
一般的な使い方まとめ

●インスタンス化

Activity や ViewModel で AppSettings(context) を作成。

●保存

suspend fun setXxx() を呼ぶ → launch { settings.setXxx(...) }

●取得

Flow として val value = settings.xxx を購読。

Compose では collectAsState(initial = ...)。

●復元

起動時 LaunchedEffect などで DataStore の値を ViewModel に反映。