es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

La composición del destino de navegación no es un hijo directo de este NavGraph cuando se tiene un destino de inicio con argumentos.

Quiero llamar a este Compose como startDestination con argumentos. Estoy obteniendo la siguiente excepción, pero si lo llamo en otro compose funciona según lo esperado.

java.lang.IllegalArgumentException: el destino de navegación xxx no es un hijo directo de este NavGraph

gradle
implementation("androidx.navigation:navigation-compose:2.4.0-beta02")

SignInActivity:
“`kotlin
class SignInActivity: BaseActivity() {

<pre><code>@Inject
lateinit var viewModelFactory: ViewModelFactory

@ExperimentalComposeUiApi
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContent {
val navController = rememberAnimatedNavController()
ComposeTravelConnectTheme {
val email="correo electrónico de prueba"
val route ="${Screens.VerifyRoute.route}/${OtpMode.EMAIL}?source=${email}"
Timber.d("$route")
Navigation(navController = navController, viewModelFactory,route)
}
}
}
//……..
</code></pre>

}

<code>Vista de navegación</code>:
“`kotlin
@ExperimentalComposeUiApi
@ExperimentalAnimationApi
@Composable
fun Navigation(
navController: NavHostController,
factory: ViewModelFactory,
startDestination: String = Screens.SignInOptionsScreensRoute.route
) {

AnimatedNavHost(
    navController = navController,
    startDestination = startDestination
) {

    composable(
        route = &quot;${Screens.VerifyRoute.route}/{otpMode}?source={source}&quot;,
        arguments = listOf(
            navArgument(&quot;otpMode&quot;) { type = NavType.StringType },
            navArgument(&quot;source&quot;) { type = NavType.StringType; defaultValue = &quot;&quot; },
        ),
        enterTransition = slideInEntryTransition,
        exitTransition = slideOutExitTransition,
        popEnterTransition = popOutEntryTransition,
    ) { backStackEntry -&gt;

        val viewModel =
            viewModel(modelClass = OtpVerifyViewModel::class.java, factory = factory)

        viewModel.setOtpState(
            otpMode = OtpMode.fromStatusValue(backStackEntry.arguments?.getString(&quot;otpMode&quot;)),
            input = backStackEntry.arguments?.getString(&quot;source&quot;) ?: &quot;&quot;
        )
        OtpVerifyScreen(viewModel, navController)
    }
}

}

Se intentó esto SO respuestas, pero no ayudó.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema que estás enfrentando es que el startDestination que estás intentando llamar con argumentos no es un hijo directo del gráfico de navegación actual. Esto puede ocurrir si has definido el destino en un gráfico de navegación diferente o si no has definido el destino en absoluto en el gráfico actual.

    Para solucionar este problema, puedes probar los siguientes pasos:

    1. Asegúrate de que el destino al que estás intentando llamar con argumentos esté definido en el gráfico de navegación actual.
    2. Si el destino está definido en un gráfico de navegación diferente, puedes incluir ese gráfico en el gráfico actual utilizando la etiqueta include o crear un nuevo gráfico que incluya tanto el gráfico actual como el gráfico de destino.

    3. Verifica si has definido el destino en absoluto en el gráfico actual. Si no lo has hecho, agrega el destino al gráfico y proporciona los argumentos necesarios.

    Una vez que hayas verificado que el destino está definido en el gráfico actual y hayas proporcionado los argumentos necesarios, puedes llamar al startDestination sin obtener la IllegalArgumentException.

Comments are closed.