Типовая безопасность в Kotlin DSL и Navigation Compose

Вы можете использовать встроенные API-интерфейсы безопасности типов, чтобы обеспечить безопасность типов во время компиляции вашего навигационного графа. Эти API доступны, если ваше приложение использует Navigation Compose или Navigation Kotlin DSL . Они доступны начиная с Navigation 2.8.0 .

Эти API эквивалентны тому, что Safe Args предоставляет для навигационных графов, построенных с использованием XML.

Определить маршруты

Чтобы использовать типобезопасные маршруты в Compose, сначала необходимо определить сериализуемые классы или объекты, которые представляют ваши маршруты.

Чтобы определить сериализуемые объекты, используйте аннотацию @Serializable предоставляемую плагином сериализации Kotlin . Этот плагин можно добавить в ваш проект, добавив эти зависимости .

Используйте следующие правила, чтобы решить, какой тип использовать для вашего маршрута:

  • Объект : используйте объект для маршрутов без аргументов.
  • Класс : используйте класс или класс данных для маршрутов с аргументами.
  • KClass<T> : используйте, если вам не нужно передавать аргументы, например класс без параметров или класс, где все параметры имеют значения по умолчанию.
    1. Например: 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 и прочитав его свойства.

Дополнительные ресурсы