передача необязательных аргументов в пункт назначения начала навигации?

Я пытался отправить пункт назначения с необязательным параметром в пункт назначения начала навигации в течение 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 с параметрами не сработает. Как я могу это сделать каким-либо образом? Можете ли вы показать мне решение? Пожалуйста

0 ответов