Navigation 3, Jetpack Compose için sıfırdan tasarlanmış bir gezinme kitaplığıdır. Bu kılavuzda, Wear OS uygulamalarında Navigation 3'ün nasıl uygulanacağı açıklanmaktadır.
Temel Kavramlar
NavKey: Uygulamanızdaki bir hedef (ekran) için tür güvenli, serileştirilebilir tanımlayıcı.NavBackStack: Gezinme geçmişini temsil edenNavKeyörneklerinin değiştirilebilir listesi. Öğeleri doğrudan bu listeden gönderip kaldırabilirsiniz.rememberNavBackStack: Yapılandırma değişiklikleri ve işlem sonlandırma boyunca eski yığını oluşturan ve kalıcı hale getiren bir composable.NavDisplay: Geri yığınını gözlemleyen ve etkin ekranı oluşturan temel kullanıcı arayüzü bileşeni.EntryProvider: BirNavKeyöğesini gerçek@Composablekullanıcı arayüzüne bağlayan bir eşleme DSL'si.SwipeDismissableSceneStrategy: Ekranlarınızı kaydırarak kapatma hareketiyle sarmalayan ve yerleşik geri animasyonlarını işleyen Wear'a özel strateji.
1. adım: Bağımlılıkları ekleyin
Projenize gerekli Navigation 3, Wear Compose ve Serialization bağımlılıklarını ekleyin.
Modern
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" }
Kotlin
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. adım: Hedefleri tanımlayın (NavKey)
Ekranlar, NavKey arayüzünü uygulayan, kesin türü belirlenmiş, serileştirilebilir nesneler veya veri sınıfları olarak tanımlanır.
@Serializable sealed interface Screen : NavKey { @Serializable data object Home : Screen @Serializable data class Details(val itemId: String) : Screen }
3. adım: NavDisplay ve geri yığını kurulumu
Uygulamanızın kök dizininde geri yığınını ve Wear OS sahne stratejisini ilk kullanıma hazırlayın, ardından bunları NavDisplay'ye bağlayın.
// 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. adım: Gezinme işlemlerini gerçekleştirin
Geri yığını yalnızca özelleştirilmiş bir MutableList olduğundan gezinme işlemi son derece basittir. İşlemleri doğrudan backStack
örneğinde yaparsınız:
- İleri Git:
backStack.add(Screen.Details("123")) - Geri gitme:
backStack.removeLast()veyabackStack.removeLastOrNull() - Temizle ve Sıfırla:
backStack.clear(); backStack.add(Screen.Home)(veya yığını değiştirmek için liste işlemlerini kullanın).
5. adım: (İsteğe bağlı) ViewModel'leri hedeflere göre kapsamlandırın
Varsayılan olarak, ViewModel'ler Activity ile sınırlandırılır. Navigation 3, ViewModel kapsamını eski yığındaki bir NavEntry ile güvenli bir şekilde sınırlamak için belirli bir yapı (lifecycle-viewmodel-navigation3) sağlar. Hedef eski yığından çıkarıldığında ViewModel temizlenir.
Bağımlılığı ekleyin:
implementation("androidx.lifecycle:lifecycle-viewmodel-navigation3:...")ViewModel mağaza parametresini
NavDisplayöğenizinentryDecoratorsbölümüne ekleyin. ComposerememberSaveabledurumunu korumak için özel dekoratörler sağlarkenSaveableStateHolderNavEntryDecoratoröğesini de açıkça eklemeniz gerekir: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() } } )