Hello! I found a strange phenomenon when using Com...
# compose
z
Hello! I found a strange phenomenon when using Compose Navigation: The same
CompositionLocalProvider
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?
Copy code
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
🧵 3
f
Each
NavBackStackEntry
is a
ViewModelStoreOwner
, so the composition local gets probably overridden somewhere along the way
☝🏼 1
👍🏻 1
☝️ 1
z
Thanks!