我正在构建的应用程序使用带有路线的组合导航。挑战在于起始目的地是动态的。
这是一个最小的例子:
class MainActivity : ComponentActivity()
{
override fun onCreate(savedInstanceState: Bundle?)
{
super.onCreate(savedInstanceState)
setContent {
val navController = rememberNavController()
NavHost(
navController = navController,
startDestination = "dynamic/1", // doesn't work
// startDestination = "static", // workaround
) {
composable(
route = "dynamic/{$ARG_ID}",
arguments = listOf(navArgument(ARG_ID) { type = NavType.StringType }),
) {
val id = it.arguments?.getString(ARG_ID)
Text("dynamic route, received argument: $id!")
}
// part of the workaround
// composable(
// route = "static",
// ) {
// LaunchedEffect(this) {
// navController.navigate("dynamic/1")
// }
// }
}
}
}
companion object
{
const val ARG_ID = "id"
}
}
该应用程序崩溃了
java.lang.IllegalArgumentException: navigation destination route/1 is not a direct child of this NavGraph
仅当“动态”路线用作起始目的地时,该问题才存在。这可以通过使用来验证startDestination = "static"
.
虽然“静态”路由解决方法有效,但我正在寻找一种没有它的解决方案,因为它会混淆代码,并且还会在返回堆栈中创建一个附加条目。
-> 完整代码示例 https://github.com/p-fischer/compose-navigation-startdestination-with-argument重现问题
相关问题
-
导航架构组件 - 将参数数据传递到 startDestination https://stackoverflow.com/q/50334550/2011622- 答案似乎不适用于撰写导航。
-
将参数传递给 Jetpack Compose 中的嵌套导航图 https://stackoverflow.com/q/70086094/2011622- 没有给出答案。
-
Compose Navigation - 导航目的地...不是此 NavGraph 的直接子级 https://stackoverflow.com/q/69038660/2011622- 接受的答案并不能解决问题。
Edit:
我想强调的是,原始示例过去不包含“静态”可组合项。我只添加了“静态”可组合项以获得工作startDestination
并证明可以导航到“动态”可组合项。
Update:
甚至切换到可选参数的查询参数语法 https://developer.android.com/jetpack/compose/navigation#optional-args、提供默认值并在不带任何参数的情况下设置起始目标是不起作用的。
以下变体
NavHost(
navController = navController,
startDestination = "dynamic",
) {
composable(
route = "dynamic?$ARG_ID={$ARG_ID}",
arguments = listOf(navArgument(ARG_ID) { type = NavType.StringType; defaultValue = "1" }),
) {
val id = it.arguments?.getString(ARG_ID)
Text("dynamic route, received argument: $id!")
}
}
导致异常
java.lang.IllegalArgumentException: navigation destination dynamic is not a direct child of this NavGraph