LaunchedEffect
LaunchedEffect のブロック内では サスペンド関数や ViewModel の関数呼び出しも可能です。Compose が初回コンポーズした後に一度だけ実行されるので、初期化処理や起動時のデータロードに適しています。
例:
LaunchedEffect(Unit) {
val initialFolderId = 10
if (treeViewModel.selectedIdState.intValue == -1) {
treeViewModel.selectedIdState.intValue = initialFolderId
treeViewModel.selectFolder(initialFolderId)
treeViewModel.setNoteTitles(initialFolderId)
}
}
Unit をキーにしているので、起動時の1回だけ実行されます。
ブロック内で viewModelScope.launch は不要です。LaunchedEffect 自体が CoroutineScope 内なので suspend 関数も直接呼べます。
Compose 側の StateFlow を更新するような関数呼び出しも安全に行えます。
つまり、TreeViewModel の初期設定や DB からのデータロードを LaunchedEffect 内で行うのは正しい方法です。
DataStore の依存関係
Gradle に依存関係を追加する
Preferences DataStore の場合
dependencies {
implementation "androidx.datastore:datastore-preferences:1.1.0" // 最新版
}