Navigation 3 — это библиотека навигации, разработанная с нуля для Jetpack Compose. В этом руководстве объясняется, как внедрить Navigation 3 в приложения Wear OS.
Основные концепции
-
NavKey: Типобезопасный, сериализуемый идентификатор для пункта назначения (экрана) в вашем приложении. -
NavBackStack: Изменяемый список экземпляровNavKey, представляющих историю навигации. Вы можете добавлять и удалять элементы непосредственно из этого списка. -
rememberNavBackStack: Составной объект, который создает и сохраняет стек возврата при изменении конфигурации и завершении процесса. -
NavDisplay: основной компонент пользовательского интерфейса, который отслеживает стек возврата и отображает активный экран. -
EntryProvider: DSL-библиотека для сопоставления, которая связываетNavKeyс его фактическим UI-элементом@Composable. -
SwipeDismissableSceneStrategy: Стратегия, разработанная специально для Wear OS, которая позволяет закрыть экран жестом смахивания и обрабатывает встроенные анимации возврата.
Шаг 1: Добавьте зависимости
Добавьте в свой проект необходимые зависимости Navigation 3, Wear Compose и Serialization.
Классный
dependencies { // Core Navigation 3 APIs implementation "androidx.navigation3:navigation3-runtime:1.2.0-alpha02" implementation "androidx.navigation3:navigation3-ui:1.2.0-alpha02" // Wear OS specific Navigation 3 integration implementation "androidx.wear.compose:compose-navigation3:1.6.1" // Kotlinx Serialization for type-safe routing implementation "org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0" }
Котлин
dependencies { // Core Navigation 3 APIs implementation("androidx.navigation3:navigation3-runtime:1.2.0-alpha02") implementation("androidx.navigation3:navigation3-ui:1.2.0-alpha02") // Wear OS specific Navigation 3 integration implementation("androidx.wear.compose:compose-navigation3:1.6.1") // Kotlinx Serialization for type-safe routing implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:1.10.0") }
Шаг 2: Определение пунктов назначения ( NavKey )
Экраны определяются как строго типизированные, сериализуемые объекты или классы данных, реализующие интерфейс NavKey .
@Serializable sealed interface Screen : NavKey { @Serializable data object Home : Screen @Serializable data class Details(val itemId: String) : Screen }
Шаг 3: Настройка NavDisplay и стека возврата.
В корневой директории вашего приложения инициализируйте стек возврата и стратегию сценариев Wear OS, а затем подключите их к NavDisplay .
// 1. Create the persistent back stack starting at the Home screen val backStack = rememberNavBackStack(Screen.Home) // 2. Initialize the Wear OS swipe-to-dismiss strategy val strategy = rememberSwipeDismissableSceneStrategy<NavKey>() // 3. Render the NavDisplay NavDisplay( backStack = backStack, sceneStrategies = listOf(strategy), entryProvider = entryProvider { // 4. Map keys to Composables entry<Screen.Home> { HomeScreen( onNavigateToDetails = { id -> backStack.add(Screen.Details(id)) } ) } entry<Screen.Details> { key -> DetailsScreen( itemId = key.itemId, onBack = { backStack.removeAt(backStack.lastIndex) } ) } } )
Шаг 4: Выполните действия навигации
Поскольку стек возврата представляет собой всего лишь настраиваемый MutableList , навигация невероятно проста. Вы выполняете операции непосредственно с экземпляром backStack :
- Переход вперед :
backStack.add(Screen.Details("123")) - Вернуться назад :
backStack.removeLast()илиbackStack.removeLastOrNull() - Очистка и сброс :
backStack.clear(); backStack.add(Screen.Home)(или используйте операции со списками для замены стека).
Шаг 5: (Необязательно) Присвойте ViewModel'ам область действия и направьте их на целевые объекты.
По умолчанию ViewModel ограничен областью видимости Activity . Navigation 3 предоставляет специальный артефакт ( lifecycle-viewmodel-navigation3 ) для безопасной привязки ViewModel к NavEntry в стеке возврата. Когда целевой элемент удаляется из стека возврата, ViewModel очищается.
Добавьте зависимость:
implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")Добавьте декоратор хранилища ViewModel в
entryDecoratorsвашегоNavDisplay. Также необходимо явно включитьSaveableStateHolderNavEntryDecoratorпри предоставлении пользовательских декораторов, чтобы сохранить состояние ComposerememberSaveable:NavDisplay( backStack = backStack, sceneStrategies = listOf(strategy), entryDecorators = listOf( rememberSaveableStateHolderNavEntryDecorator(), rememberViewModelStoreNavEntryDecorator() ), entryProvider = entryProvider { entry<Screen.Home> { // Any viewModel() requested here will be scoped to this NavEntry val viewModel: HomeViewModel = viewModel() } } )