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 に反映。