llegalArgumentException:在导航图中找不到与请求 NavDeepLinkRequest-geoMarkerScreen 匹配的导航目的地

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

我在我的应用程序中使用 jetpack 撰写导航,但在尝试从 homeScreen 导航到 geoMarkerScreen 时出现 IllegalArgumentException。问题出现在 BottomNavigationBar...我该如何解决这个问题?我已经设置了 NavHost

package com.example.bettehomes.navigation


    import androidx.compose.material3.NavigationBar
    import androidx.compose.material3.NavigationBarItem
    import androidx.compose.material3.Icon
    import androidx.compose.material3.Text
    import androidx.compose.runtime.Composable
    import androidx.compose.runtime.getValue
    import androidx.navigation.NavController
    import androidx.navigation.compose.currentBackStackEntryAsState
    
    
    @Composable
    fun BottomNavigationBar(navController: NavController) {
        NavigationBar {
            val navBackStackEntry by navController.currentBackStackEntryAsState()
            val currentRoute = navBackStackEntry?.destination?.route
    
            BottomNavItem.values().forEach { item ->
                NavigationBarItem(selected = currentRoute == item.route,
                    onClick = {
                        navController.navigate(item.route) {
                            popUpTo(navController.graph.startDestinationId) {
                                saveState = true
                            }
                            launchSingleTop = true
                            restoreState = true
                        }
                    }, icon = { Icon(item.icon, contentDescription = null) },label = { Text(item.label) })
                        }
        }

} 

错误似乎位于:

com.example.bettehomes.navigation.BottomNavigationBarKt$BottomNavigationBar$1$1$1.invoke(BottomNavigationBar.kt:23)
                                                                                                        at com.example.bettehomes.navigation.BottomNavigationBarKt$BottomNavigationBar$1$1$1.invoke(BottomNavigationBar.kt:21)

NavHost.kt:

package com.example.bettehomes.navigation

import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHostState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.bettehomes.data.login.AuthViewModel
import com.example.bettehomes.presentation.GeoMarkerViewModel
import com.example.bettehomes.presentation.authscreens.HomeScreen
import com.example.bettehomes.presentation.authscreens.LoginScreen
import com.example.bettehomes.presentation.authscreens.PrivacyPolicyScreen
import com.example.bettehomes.presentation.authscreens.SignUpScreen
import com.example.bettehomes.presentation.authscreens.TermsAndConditionsScreen
import com.example.bettehomes.presentation.authscreens.settings.SettingsScreen
import com.example.bettehomes.presentation.authscreens.splash.SplashScreen
import com.example.bettehomes.presentation.mapscreens.GeoMarkerScreen
import com.example.bettehomes.presentation.mapscreens.MapsScreen

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AppNavigation(
    snackbarHostState: SnackbarHostState,
    geoMarkerViewModel: GeoMarkerViewModel,
    fetchLocationUpdates: () -> Unit,
    authViewModel: AuthViewModel = hiltViewModel()
) {
    val navController = rememberNavController()
    val isAuthenticated by authViewModel.isAuthenticated.collectAsState()
    Scaffold(
        bottomBar = {
            BottomNavigationBar(navController = navController)
        }
    ) {it
        NavHost(navController = navController, startDestination = Screens.SplashScreen) {
            composable(Screens.SplashScreen) {
                SplashScreen(openAndPopUp = { route, popUp ->
                    navController.navigateAndPopUp(route, popUp)
                })
            }
            composable(Screens.HomeScreen) {
                HomeScreen()
            }

            composable(Screens.MapScreen) {
                MapsScreen(
                    snackbarHostState = snackbarHostState,
                    navController = navController,
                    fetchLocationUpdates = fetchLocationUpdates
                )
            }

            composable(Screens.SignUpScreen) {
                SignUpScreen(navController)
            }
            composable(Screens.LoginScreen) {
                LoginScreen(navController)
            }
            composable(Screens.TermsAndConditions) {
                TermsAndConditionsScreen(navController)
            }
            composable(Screens.PrivacyPolicy) {
                PrivacyPolicyScreen(navController)
            }

            if (isAuthenticated) {
                composable(Screens.GeoMarkerScreen) {
                    GeoMarkerScreen(geoMarkerViewModel, navController)
                }
            } else {
                composable(Screens.LoginScreen) {
                    LoginScreen(navController)
                }
            }

            composable(Screens.SettingsScreen) {
                SettingsScreen(
                    restartApp = { route ->
                        navController.clearAndNavigate(
                            route,
                            startDestination = 1
                        )
                    },
                    openScreen = { route -> navController.navigate(route) }
                )
            }
        }
    }
}
navigation android-jetpack-compose bottom-navigation-bar
1个回答
0
投票

您只能使用

NavHost
构建器功能导航到您在
composable
中定义的目的地。您定义了一个
Screens.GeoMarkerScreen
路线,因此如果您想导航到该屏幕,
item.route
中的
navController.navigate(item.route)
必须与
Screens.GeoMarkerScreen
包含的内容完全相同。

由于您的问题没有告诉我们

item
是什么或它的
route
属性包含什么,我只能从抛出的异常中推断出它 not 包含有效的导航路线。您可以通过在该行设置断点并将
item.route
的实际内容与
Screens.GeoMarkerScreen
进行比较来轻松验证这一点。

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