передача необязательных аргументов в пункт назначения начала навигации?
Я пытался отправить пункт назначения с необязательным параметром в пункт назначения начала навигации в течение 2 дней, но обнаружил, что это невозможно. Начальный пункт навигации должен был совпадать с посимвольным маршрутом, поэтому он должен был быть точно таким же, поэтому я сталкивался с этой ошибкой в течение 2 дней.
java.lang.IllegalArgumentException: пункт назначения навигацииverification_phone_code_screen?isRedirectFromLoginOrSplash=true не является прямым дочерним элементом этого NavGraph
Что я сделал:
Я написал функцию, которая определяет экран, на который нужно перейти в MainActivity, она указывает, куда идти согласно этим условиям.
private fun navigateIfNeeded(response: NavigateState, isTokenExist:Boolean): String {
return when {
!isTokenExist -> RegisterScreen.SignUpStartRegisterScreen.route
response.hasValidation == 0 -> "${RegisterScreen.SignUpVerificationPhoneCodeScreen.route}?$EMAIL={$EMAIL}&$PHONE={$PHONE}&$IS_REDIRECT_FROM_LOGIN_OR_SPLASH={$IS_REDIRECT_FROM_LOGIN_OR_SPLASH}"
response.hasValidation == 1 -> {
when (response.eatingHabit) {
0 -> {
if (response.weight == 0 || response.goalWeight == 0) {
return RegisterScreen.SignUpDailyCalorieGoalScreen.route
} else{
return DASHBOARD_ROUTE
}
}
else -> RegisterScreen.SignUpPaymentScreen.route
}
}
else -> DASHBOARD_ROUTE
}
}
response.hasValidation == 0 -> "${RegisterScreen.SignUpVerificationPhoneCodeScreen.route}?$EMAIL={$EMAIL}&$PHONE={$PHONE}&$IS_REDIRECT_FROM_LOGIN_OR_SPLASH={$IS_REDIRECT_FROM_LOGIN_OR_SPLASH}"
Когда следующее условие срабатывает, здесь выдает ошибку, конечно, так как я дал полный путь, все проходит гладко, но я хочу здесь передать истинное логическое значение в параметр IS_REDIRECT_FROM_LOGIN_OR_SPLASH , но это невозможно насколько я понимаю
Я отправляю начальный пункт назначения в свой корневой NavGraph следующим образом: MainActivity setContent setContent {
AppTheme {
navHostController = rememberNavController()
Surface(
modifier = Modifier
.fillMaxSize()
) {
RootNavGraph(navHostController = navHostController, startDestination)
}
}
}
и я получаю его в RootNavGraph и устанавливаю вот так
Если входящее значение startDestination — это маршрут информационной панели, я говорю «перейти к DASHBOARD_ ROUTE» , если это не маршрут информационной панели, я перехожу к REGISTER_LOGIN_ROUTE. Здесь нет проблем
@Composable
fun RootNavGraph(
navHostController: NavHostController,
startDestination: String,
) {
val sharedViewModel: SharedViewModel = viewModel()
val startRoute =
if (startDestination != DASHBOARD_ROUTE) REGISTER_LOGIN_ROUTE else DASHBOARD_ROUTE
NavHost(
navController = navHostController,
startDestination = startRoute,
route = ROOT_ROUTE
)
{
registerLoginNavGraph(navHostController, sharedViewModel, startDestination)
dashBoardNavGraph(navHostController, sharedViewModel)
}
}
Куда я хочу пойти дальше, это то место, которое я задаю в этой проблеме, поэтому SignUpVerificationPhoneCodeScreen , RegisterLoginNavGraph также
послушай, это моя регистрацияВойтиNavGraph
fun NavGraphBuilder.registerLoginNavGraph(
navHostController: NavHostController,
sharedViewModel: SharedViewModel,
startDestination: String,
) {
val _startDestination =
if (startDestination == "")
RegisterScreen.SignUpStartRegisterScreen.route
else
startDestination
navigation(
startDestination = _startDestination,
route = REGISTER_LOGIN_ROUTE
) {
.
.
.
composable(
route = "${RegisterScreen.SignUpVerificationPhoneCodeScreen.route}?$EMAIL={$EMAIL}&$PHONE={$PHONE}&$IS_REDIRECT_FROM_LOGIN_OR_SPLASH={$IS_REDIRECT_FROM_LOGIN_OR_SPLASH}",
arguments = listOf(
navArgument(EMAIL) {
type = NavType.StringType
defaultValue = ""
},
navArgument(PHONE) {
type = NavType.StringType
defaultValue = ""
},
navArgument(IS_REDIRECT_FROM_LOGIN_OR_SPLASH) {
type = NavType.BoolType
defaultValue = false
}
)
) { backStackEntry ->
VerificationPhoneCodeRoute(
navHostController,
sharedViewModel,
userPhone = backStackEntry.arguments?.getString(PHONE),
userEmail = backStackEntry.arguments?.getString(EMAIL),
isRedirectFromLoginOrSplash = backStackEntry.arguments?.getBoolean(
IS_REDIRECT_FROM_LOGIN_OR_SPLASH
)
)
}
Например, когда startDestination поставляется с параметрами, это выглядит так:
"${RegisterScreen.SignUpVerificationPhoneCodeScreen.route}?$IS_REDIRECT_FROM_LOGIN_OR_SPLASH=true"
это дает эту ошибку
java.lang.IllegalArgumentException: пункт назначения навигацииverification_phone_code_screen?isRedirectFromLoginOrSplash=true не является прямым дочерним элементом этого NavGraph
Есть ли способ решить эту проблему здесь? Я хочу отправить параметр или значение на Verification_phone_code_screen, который я могу только проверить. Я могу сделать это по-другому, но не могу придумать решения. Скорее всего, отправка startDestination с параметрами не сработает. Как я могу это сделать каким-либо образом? Можете ли вы показать мне решение? Пожалуйста