Jetpack Composeで各画面にViewModelを追加する
最終更新日:2022-05-09
Android Architecture Componentで登場したViewModelはJetpack Composeでも用意されています。
ViewModelとは、
- 画面(Screen)に関するデータの保持と操作を担当
- 画面回転といったconfiguration changeが生じてもインスタンスは保持される
という性質をもったオブジェクトです。
ライブラリを追加する
アプリでViewModelを使うには、 lifecycle-viewmodel-compose
を追加する必要があります。
dependencies {
...
implementation "androidx.lifecycle:lifecycle-viewmodel-compose:2.4.0-rc01"
}
ViewModelを継承したクラスを作る
Viewシステムの時と同様に ViewModel
を継承したクラスを作ります。今回は MainScreen
用のViewModelとして MainViewModel
を作ります。
class MainViewModel: ViewModel() {
}
ViewModelをパラメータとして受け取る
画面のルートとなるComposableで、ViewModelをパラメータとして受け取るようにします。
@Composable
fun MainScreen(
viewModel: MainViewModel, // 追加した
toSecond: () -> Unit,
) {
...
}
NavHostの中でインスタンスを取得する
ViewModelのインスタンスは NavHost
の中で viewModel()
を使って取得します。Navigation Composeを使って画面遷移を実現している場合、今どの画面にいるかを表す navBackStackEntry
に関連づけられてViewModelが作られるようになります。
NavHost(navController = navController, startDestination = "main") {
composable("main") {
// ViewModelインスタンスの取得
val viewModel: MainViewModel = viewModel()
// そしてComposable関数のパラメータとして渡す
MainScreen(viewModel) {
navController.navigate("second")
}
}
composable("second") {
SecondScreen()
}
}