无法从 JetpackCompose 中的另一个 NavGraph 导航到屏幕

Yun*_*ane 5 navigation android kotlin android-jetpack-navigation android-jetpack-compose

我有该应用程序,那里有 2 个导航图。首先是RootNavGraph

@Composable
fun RootNavGraph(navController: NavHostController) {
    NavHost(navController, startDestination = RootGraphItem.Splash.route) {
        composable(route = RootGraphItem.Splash.route) {
            SplashScreen(navController = navController)
        }
        composable(route = RootGraphItem.Login.route) {
            LoginScreen(navController = navController)
        }
        composable(route = RootGraphItem.Register.route) {
            RegisterScreen(navController = navController)
        }
        composable(route = RootGraphItem.Main.route) {
            MainScreen()
        }
        composable(route = RootGraphItem.BasicInfo.route) {
            BasicInfoScreen(navController = navController)
        }
        composable(route = RootGraphItem.GenderIdentity.route) {
            GenderIdentityScreen(navController = navController)
        }
        composable(route = RootGraphItem.SexualOrientation.route) {
            SexualOrientationScreen(navController = navController)
        }
        composable(route = RootGraphItem.Pronouns.route) {
            PronounsScreen(navController = navController)
        }
        composable(route = RootGraphItem.Interests.route) {
            InterestsScreen(navController = navController)
        }
        composable(route = RootGraphItem.Description.route) {
            DescriptionScreen(navController = navController)
        }
        composable(route = RootGraphItem.Photos.route) {
            PhotosScreen(navController = navController)
        }
        composable(route = RootGraphItem.SearchingPreferences.route) {
            SearchingPreferencesScreen(navController = navController)
        }
        composable(route = RootGraphItem.AgeHeightLocation.route) {
            AgeHeightLocationScreen(navController = navController)
        }
        composable(route = RootGraphItem.WhyYouHere.route) {
            WhyYouHereScreen(navController = navController)
        }
        composable(route = RootGraphItem.Start.route) {
            StartScreen(navController = navController)
        }
        composable(route = RootGraphItem.Location.route) {
            LocationScreen(navController = navController)
        }
        composable(route = RootGraphItem.UniversityWork.route) {
            UniversityWorkScreen(navController = navController)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个是BottomNavGraph(用于底部导航栏):


@Composable
fun BottomNavGraph(navController: NavHostController) {
    NavHost(navController, startDestination = BottomNavItem.Home.screen_route) {
        composable(route = BottomNavItem.Home.screen_route){
            HomeScreen(navController)
        }
        composable(route = BottomNavItem.Chat.screen_route){
            LastChatsScreen()
        }
        composable(route = BottomNavItem.Profile.screen_route){
            ProfileScreen(navController)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在BottomNavBarProfileScreen中有一个注销图标:

@Composable
fun ProfileScreen(navController: NavHostController) {
    val context = LocalContext.current
    val loggedInViewModel: LoggedInViewModel = viewModel()
    var loggedOut = loggedInViewModel.getLoggedOutLiveData().observeAsState()
    if(loggedOut.value != null && loggedOut.value == true) {
        navController.navigate(RootGraphItem.Login.route) <- error occurs here
    }

    Column(
        modifier = Modifier
            .fillMaxSize()
            .background(Color.White)
            .verticalScroll(rememberScrollState())
    ) {
        Row(
            modifier = Modifier
                .padding(horizontal = 16.dp, vertical = 32.dp)
                .fillMaxWidth(),
            horizontalArrangement = Arrangement.SpaceBetween,
            verticalAlignment = Alignment.CenterVertically
        ) {
            Text(
                text = "Your profile",
                style = TextStyle(fontSize = 32.sp, fontWeight = FontWeight.W400)
            )
                Icon(
                    modifier = Modifier
                        .size(32.dp)
                        .clickable {
                            loggedInViewModel.logOut()
                        },
                    painter = painterResource(id = R.drawable.icon_logout),
                    contentDescription = null
                )
        }
        ...
}
Run Code Online (Sandbox Code Playgroud)

在我单击注销图标后,应用程序应该注销用户并导航到登录屏幕,但它返回一个错误:

java.lang.IllegalArgumentException:在导航图中找不到与请求 NavDeepLinkRequest{ uri=android-app://androidx.navigation/login_screen } 匹配的导航目的地 NavGraph(0x0) startDestination={Destination(0x442b361f) route=home_screen}

导航出了什么问题?我该如何处理?

小智 1

You need to send a navController to RootNavGraph in startDestination or in App class. You should assign it like below before passing it;

val navController = rememberNavController()
RootNavGraph(navController)
Run Code Online (Sandbox Code Playgroud)

You can handle it this way.