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 = "${Screens.VerifyRoute.route}/{otpMode}?source={source}",
arguments = listOf(
navArgument("otpMode") { type = NavType.StringType },
navArgument("source") { type = NavType.StringType; defaultValue = "" },
),
enterTransition = slideInEntryTransition,
exitTransition = slideOutExitTransition,
popEnterTransition = popOutEntryTransition,
) { backStackEntry ->
val viewModel =
viewModel(modelClass = OtpVerifyViewModel::class.java, factory = factory)
viewModel.setOtpState(
otpMode = OtpMode.fromStatusValue(backStackEntry.arguments?.getString("otpMode")),
input = backStackEntry.arguments?.getString("source") ?: ""
)
OtpVerifyScreen(viewModel, navController)
}
}
}
Se intentó esto SO respuestas, pero no ayudó.
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:
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.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 laIllegalArgumentException
.