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

问题描述 投票:0回答:1

我有该应用程序,并且那里有 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)
        }
    }
}

第二个是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)
        }
    }
}

我在 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
                )
        }
        ...
}

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

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

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

android kotlin navigation android-jetpack-compose android-jetpack-navigation
1个回答
0
投票

您需要在startDestination或App类中将navController发送到RootNavGraph。在传递它之前,您应该像下面这样分配它;

val navController = rememberNavController()
RootNavGraph(navController)

你可以这样处理。

© www.soinside.com 2019 - 2024. All rights reserved.