You can to pass your top viewModelStoreOwner
to each destination
- directly passing to
.viewModel()
call,composable("first")
in my example - overriding
LocalViewModelStoreOwner
for the whole content, so each composable insideCompositionLocalProvider
will have access to the same view models,composable("second")
in my example
val viewModelStoreOwner = checkNotNull(LocalViewModelStoreOwner.current) {
"No ViewModelStoreOwner was provided via LocalViewModelStoreOwner"
}
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "first") {
composable("first") {
val model = viewModel<SharedModel>(viewModelStoreOwner = viewModelStoreOwner)
}
composable("second") {
CompositionLocalProvider(
LocalViewModelStoreOwner provides viewModelStoreOwner
) {
SecondScreen()
}
}
}
In the second case, you can get your model at any level of the composition tree, which is inside the CompositionLocalProvider
:
@Composable
fun SecondScreen() {
val model = viewModel<SharedModel>()
SomeView()
}
@Composable
fun SomeView() {
val model = viewModel<SharedModel>()
}