HiltとJetpack Compose
一言で表すと
Dagger HiltとJetpack Composeを組み合わせて使う
概要
ViewModel
viewModel() 関数を使ってComposable関数にViewModelをInjectできる
code:kotlin
@HiltViewModel
class ExampleViewModel @Inject constructor(
private val savedStateHandle: SavedStateHandle,
private val repository: ExampleRepository
) : ViewModel() { /* ... */ }
@Composable
fun ExampleScreen(
exampleViewModel: ExampleViewModel = viewModel()
) { /* ... */ }
viewModel() 関数の中身はこうなっていた
code:kotlin
public fun <VM : ViewModel> viewModel(
modelClass: Class<VM>,
viewModelStoreOwner: ViewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
},
key: String? = null,
factory: ViewModelProvider.Factory? = null
): VM = viewModelStoreOwner.get(modelClass, key, factory)
Mori Atsushi.icon LocalViewModelStoreOwner、知らない子だ(androidx.lifecycle.viewmodel.compose)
@HiltViewModel のアノテーションが付けられた ViewModel のスコープがナビゲーション グラフに設定されている場合は、@AndroidEntryPoint のアノテーションが付けられたフラグメントまたはアクティビティで機能するコンポーズ可能な関数 hiltViewModel() を使用する
code:kotlin
@Composable
fun MyApp() {
NavHost(navController, startDestination = startRoute) {
composable("example") { backStackEntry ->
// Creates a ViewModel from the current BackStackEntry
// Available in the androidx.hilt:hilt-navigation-compose artifact
val exampleViewModel = hiltViewModel<ExampleViewModel>()
ExampleScreen(exampleViewModel)
}
/* ... */
}
}
代わりに、ナビゲーション ルートにスコープを設定された ViewModel のインスタンスを取得する必要がある場合は、デスティネーション ルートをパラメータとして渡す
code:kotlin
@Composable
fun MyApp() {
NavHost(navController, startDestination = startRoute) {
navigation(startDestination = innerStartRoute, route = "Parent") {
// ...
composable("exampleWithRoute") { backStackEntry ->
val parentViewModel = hiltViewModel<ParentViewModel>(
navController.getBackStackEntry("Parent")
)
ExampleWithRouteScreen(parentViewModel)
}
}
}
}
mayamito.icon これで親の画面のViewModelをとってくるみたいなことができるんじゃないかな
気になるポイント
mayamito.icon ViewModelをInject可能にするやり方がいくつかあるのがよくわからん
別のドキュメントではこれ↓
code:kotlin
class ExampleViewModel @ViewModelInject constructor(
private val repository: ExampleRepository,
@Assisted private val savedStateHandle: SavedStateHandle
) : ViewModel() {
...
}
chigi ViewModelInjectはdeprecatedっぽい
コメント
mayamito.icon 結局HiltのCompositionLocalみたいなのは見つからなかった……
夢オチ?
Mori Atsushi.icon Jetpack ComposeとViewModelどうする?
chigi navigation graph scopeを使うの良さそうだった
Mori Atsushi.icon マルチプラットフォームを想定する?
Mori Atsushi.icon 画面回転するときに破棄しなければAndroid ViewModelはいらない?
chigi 新旧混じってる場合は破棄せざる負えない