Вот минимальный пример:
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".
Хотя обходной путь "статического" маршрута работает, я ищу решение без него, потому что это как бы запутывает код, а также создает дополнительную запись в заднем стеке.
-> Полный пример кода для воспроизведения проблемы
Связанные вопросы по SO
- Компонент архитектуры навигации — передача данных аргумента в startDestination — ответы, похоже, неприменимы к составлению навигации.
- Пройти аргумент вложенного графа навигации в Jetpack Compose — ответ не дан.
- Compose Navigation — пункт назначения навигации… не является прямым дочерним элементом этого NavGraph — принятый ответ не разрешается проблема.
Я хочу подчеркнуть, что исходный образец используется, чтобы не содержать «статические» составные элементы. Я добавил «статический» составной объект только для того, чтобы иметь рабочий startDestination и доказать, что к «динамическому» составному объекту можно перейти.
Обновление:
Даже переключение на синтаксис параметров запроса для необязательных аргументов, предоставление значения по умолчанию и установка начального пункта назначения без каких-либо аргументов не работает.
Следующий вариант
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
Подробнее здесь: https://stackoverflow.com/questions/704 ... estination
Мобильная версия