Jetpack Compose Navigation — передать аргумент в startDestinationAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Jetpack Compose Navigation — передать аргумент в startDestination

Сообщение Anonymous »

Приложение, которое я создаю, использует составление навигации с маршрутами. Проблема в том, что начальный пункт назначения является динамическим.
Вот минимальный пример:
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»