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: 323471009
Filip 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