Zhang Zihan
01/21/2025, 12:21 PMCompositionLocalProvider is used in the outer layer, but the results in the inner layer are inconsistent.
As shown in the code, navController can be passed correctly, but viewModelStoreOwner fails to pass.
Is this a BUG?
val LocalNavController = staticCompositionLocalOf<NavController?> { null }
@Serializable
data object HomepageDestination
@Composable
fun App() {
val viewModelStoreOwner = LocalViewModelStoreOwner.current!!
val navController = rememberNavController()
LaunchedEffect(Unit) {
println("viewModelStoreOwner in App: ${viewModelStoreOwner.hashCode()}")
println("navController in App: ${navController.hashCode()}")
}
CompositionLocalProvider(
LocalNavController provides navController,
LocalViewModelStoreOwner provides viewModelStoreOwner
) {
NavHost(
navController = navController,
startDestination = HomepageDestination
) {
composable<HomepageDestination> {
val viewModelStoreOwnerInner = LocalViewModelStoreOwner.current!!
val navControllerInner = LocalNavController.current!!
LaunchedEffect(Unit) {
println("viewModelStoreOwnerInner: ${viewModelStoreOwnerInner.hashCode()}")
println("navControllerInner: ${navControllerInner.hashCode()}")
}
}
}
}
}
// OUTPUT:
// viewModelStoreOwner: 1783200589
// navController: 323471009
// viewModelStoreOwnerInner: 391682979
// navControllerInner: 323471009Filip Wiesner
01/21/2025, 12:44 PMNavBackStackEntry is a ViewModelStoreOwner, so the composition local gets probably overridden somewhere along the wayZhang Zihan
01/21/2025, 1:42 PM