Navigation 3, Jetpack Compose'un gezinme durumunu ele alma konusunda temel bir değişimi temsil eder ve Navigation 2'ye kıyasla önemli mimari avantajlar sunar.
Wear Compose uygulamasını Navigation 2'den Navigation 3'e taşımak için gereken mimari değişiklikleri ve adımları anlama.
Navigation 3'ün temel avantajları
- Doğrudan Geri Yığın Kontrolü:
NavBackStack, temelde kullanıcının ziyaret ettiği ekranların geçmişini temsil edenNavKeynesnelerinin değiştirilebilir bir listesidir. Bu listeyi, diğer KotlinMutableList(add,removeLast,clear) gibi kontrol edersiniz. İleri gitmek için anahtar ekleme veya geri gitmek için anahtar kaldırma gibi gezinme işlemlerini gerçekleştirmek üzere listeyi doğrudan değiştirirsiniz. - Önce Oluşturma Tasarımı: Geri yığın, standart gözlemlenebilir durum olarak modellenir. Gezinme geçmişinizi değiştirme işlemi, diğer Compose durumlarını güncellemeye benzer şekilde çalışır ve mevcut ekranı göstermek için yeniden oluşturmayı otomatik olarak tetikler.
- Varsayılan olarak tür güvenlidir: Dize tabanlı rotalar tamamen ortadan kaldırılır. Gezinme, serileştirilebilir veri nesnelerini ve veri sınıflarını kullanır.
- Ayrılmış Sunumlar (Sahne Stratejileri): Kullanıcı arayüzü geçiş katmanı
(
NavDisplayveSwipeDismissableSceneStrategy), durum izlemeden (NavBackStack) tamamen ayrılmıştır. Bu sayede, yerleşik Wear OS gezinme geçişlerinin daha basit bir şekilde entegre edilmesi sağlanır.
Taşıma adımları
1. Bağımlılıkları güncelleme
Eski androidx.wear.compose:compose-navigation bağımlılığını kaldırın ve Kotlin serileştirme desteğiyle birlikte yeni ayrılmış Navigation 3 bağımlılıklarını kullanmaya başlayın.
Kaldırma:
implementation("androidx.wear.compose:compose-navigation:...")
Ekleme:
implementation("androidx.navigation3:navigation3-runtime:...") // State logic
implementation("androidx.navigation3:navigation3-ui:...") // Display logic
implementation("androidx.wear.compose:compose-navigation3:...") // Wear gestures
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:...") // Requires compiler plugin
2. NavKey özelliğini uygulamak için hedefleri güncelleme
Navigation 2'de yönlendirme için dizeler veya genel nesneler kullanmış olabilirsiniz. Navigation 3'te NavKey işaretleyici arayüzünü uygulamanız ve her ekran nesnesine @Serializable ile ek açıklama eklemeniz gerekir.
Bu neden gerekli? Eski yığının, işlem sonlandırıldığında kaydedilip geri yüklenebilmesini sağlamak için temel alınan navigation3-runtime, durumu serileştirmek üzere kotlinx-serialization'e dayanır.
Before (Navigation 2 - Generic Type-Safe Routes):
sealed class Nav2Screen { data object Landing : Nav2Screen() data object List : Nav2Screen() }
After (Navigation 3 - NavKey + Serializable):
@Serializable sealed interface MigrationScreen : NavKey { @Serializable data object Landing : MigrationScreen @Serializable data object List : MigrationScreen }
3. Yönlendirme mantığını değiştirme (NavController yerine NavBackStack)
NavController öğenizi rememberNavBackStack aracılığıyla başlatılan bir NavBackStack ile değiştirin. Ayrıca, SwipeDismissableSceneStrategy öğesini Wear OS için özel olarak oluşturmanız gerekir.
Önce (Gezinme 2):
val navController = rememberSwipeDismissableNavController()
Sonra (Gezinme 3):
val backStack = rememberNavBackStack(MigrationScreen.Landing as NavKey) val strategy = rememberSwipeDismissableSceneStrategy<NavKey>()
4. NavHost yerine NavDisplay ve entryProvider DSL'yi kullanın.
NavHost kapsayıcısı ve dahili composable("route") { ... } oluşturucu DSL'si, NavDisplay ve entryProvider {
entry<Key> { ... } } DSL ile değiştirilir.
Önce (Gezinme 2):
SwipeDismissableNavHost(navController = navController, startDestination = "menu") { composable("menu") { GreetingScreen( onShowList = { navController.navigate("list") } ) } composable("list") { ListScreen() } }
Sonra (Gezinme 3):
NavDisplay( backStack = backStack, sceneStrategies = listOf(strategy), entryProvider = entryProvider { entry<MigrationScreen.Landing> { GreetingScreen( onShowList = { backStack.add(MigrationScreen.List) } ) } entry<MigrationScreen.List> { ListScreen() } } )