我在我的应用程序中使用 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) }
)
}
}
}
}
您只能使用
NavHost
构建器功能导航到您在 composable
中定义的目的地。您定义了一个 Screens.GeoMarkerScreen
路线,因此如果您想导航到该屏幕,item.route
中的 navController.navigate(item.route)
必须与 Screens.GeoMarkerScreen
包含的内容完全相同。
由于您的问题没有告诉我们
item
是什么或它的 route
属性包含什么,我只能从抛出的异常中推断出它 not 包含有效的导航路线。您可以通过在该行设置断点并将 item.route
的实际内容与 Screens.GeoMarkerScreen
进行比较来轻松验证这一点。