Вы можете использовать встроенные API-интерфейсы безопасности типов, чтобы обеспечить безопасность типов во время компиляции вашего навигационного графа. Эти API доступны, если ваше приложение использует Navigation Compose или Navigation Kotlin DSL . Они доступны начиная с Navigation 2.8.0
.
Эти API эквивалентны тому, что Safe Args предоставляет для навигационных графов, построенных с использованием XML.
Определить маршруты
Чтобы использовать типобезопасные маршруты в Compose, сначала необходимо определить сериализуемые классы или объекты, которые представляют ваши маршруты.
Чтобы определить сериализуемые объекты, используйте аннотацию @Serializable
предоставляемую плагином сериализации Kotlin . Этот плагин можно добавить в ваш проект, добавив эти зависимости .
Используйте следующие правила, чтобы решить, какой тип использовать для вашего маршрута:
- Объект : используйте объект для маршрутов без аргументов.
- Класс : используйте класс или класс данных для маршрутов с аргументами.
-
KClass<T>
: используйте, если вам не нужно передавать аргументы, например класс без параметров или класс, где все параметры имеют значения по умолчанию.- Например:
Profile::class
- Например:
Во всех случаях объект или класс должны быть сериализуемыми.
Например:
// Define a home route that doesn't take any arguments
@Serializable
object Home
// Define a profile route that takes an ID
@Serializable
data class Profile(val id: String)
Постройте свой график
Далее вам нужно определить граф навигации. Используйте функцию composable()
, чтобы определить составные объекты в качестве пунктов назначения в вашем навигационном графе.
NavHost(navController, startDestination = Home) {
composable<Home> {
HomeScreen(onNavigateToProfile = { id ->
navController.navigate(Profile(id))
})
}
composable<Profile> { backStackEntry ->
val profile: Profile = backStackEntry.toRoute()
ProfileScreen(profile.id)
}
}
В этом примере обратите внимание на следующее:
-
composable()
принимает параметр типа. То естьcomposable<Profile>
. - Определение типа назначения — более надежный подход, чем передача строки
route
, как вcomposable("profile")
. - Класс маршрута определяет тип каждого аргумента навигации, например
val id: String
, поэтомуNavArgument
не нужен. - Для маршрута профиля метод расширения
toRoute()
воссоздает объектProfile
изNavBackStackEntry
и его аргументов.
Дополнительные сведения о том, как в целом разработать график, см. на странице «Создание графика навигации» .
Перейдите к вводу безопасного маршрута
Наконец, вы можете перейти к составному объекту с помощью функции navigate()
, передав экземпляр маршрута:
navController.navigate(Profile(id = 123))
Это приведет пользователя к месту назначения composable<Profile>
в графе навигации. Любые аргументы навигации, такие как id
, можно получить, реконструировав Profile
с помощью NavBackStackEntry.toRoute
и прочитав его свойства.