Navigation Compose, Jetpack Compose üzerine inşa edilmiş Android uygulamaları içinde bildirimsel navigasyon için bir Jetpack kütüphanesidir. FragmentManager veya Intent tabanlı navigasyon yerine, Navigation Compose NavController ve NavHost aracılığıyla yönetilen tek bir rota grafiği sunar. Google I/O'ya (2025) göre, Navigation Compose, Compose uygulamaları için önerilen navigasyon yöntemidir ve yeni projelerin %70'inden fazlasında kullanılmaktadır. Kütüphane, tür belirtilmiş argümanların iletilmesini, derin bağlantıları, geçiş animasyonlarını ve SavedStateHandle aracılığıyla ViewModel ile entegrasyonu destekler.
Önemli Noktalar
Navigation Compose, Compose uygulamaları için bir navigasyon çerçevesi sağlayan Jetpack paketindeki bir kütüphanedir. Kütüphane, View sistemi için Navigasyon Bileşeni ile aynı prensiplere dayanır, ancak Compose'un bildirimsel doğasına uyarlanmıştır: FragmentTransaction yerine composable işlevler kullanılır ve navigasyon grafiği Kotlin DSL aracılığıyla oluşturulur.
Navigation Compose ile klasik navigasyon arasındaki temel fark, FragmentManager'ın olmamasıdır. Her ekran, rota eşleştiğinde NavHost'ta işlenen bir composable işlevdir. Geri yığını bir Fragment değil, rota, argümanlar ve durum içeren bir kayıt saklar. Bu, mimariyi basitleştirir ve Fragment tabanlı navigasyonun tipik yaşam döngüsü çatışmalarını ortadan kaldırır.
Google'a (2025) göre, Navigation Compose deneyselden kararlıya geçmiştir ve 2.8.0 sürümünden itibaren Jetpack'in bir parçasıdır. Kütüphane, Material3, tür güvenli navigasyon (Kotlin Serialization aracılığıyla), iç içe grafikler ve modülerleştirmeyi destekler. Tek sınırlama, kütüphanenin manuel yapılandırma olmadan BottomNavigation için çoklu geri yığını desteklememesidir, ancak Google bunun üzerinde çalışmaktadır.
Navigation Compose'un mimarisi üç varlık etrafında döner: NavController (yığın yönetimi), NavHost (grafik kapsayıcısı) ve NavDestination (composable ile bireysel rota). Aralarındaki etkileşim bildirimseldir: geliştirici rotaları ve argümanları tanımlar, kütüphane ise yükleme, koruma ve geri yükleme durumlarını yönetir.
NavController, Navigation Compose'un navigasyon yığınını yöneten merkezi öğesidir. rememberNavController() aracılığıyla oluşturulur ve NavHost'a iletilir. NavController, geri yığınını, geçerli giriş noktasını saklar ve ertelenmiş eylemleri (grafik başlatma sonrası derin bağlantı) destekler.
@Composable
fun AppNavigation() {
val navController = rememberNavController()
NavHost(navController = navController, startDestination = "home") {
composable("home") { HomeScreen(navController) }
composable("profile/{userId}") { backStackEntry ->
ProfileScreen(
userId = backStackEntry.arguments?.getString("userId") ?: ""
)
}
}
}
NavController'ın ana yöntemleri: navigate(route) — bir rotaya gitme, popBackStack() — önceki ekrana dönme, navigateAndClear(route) — yığını temizleyerek gitme. NavOptions davranışı belirtir: launchSingleTop kopyaları önler, popUpTo belirtilen rotaya kadar yığını temizler, restoreState önceki durumu geri yükler.
Derinlemesine iç içe geçmiş composable işlevlerden NavController'a erişmek için CompositionLocal aracılığıyla NavHostController kullanın. LocalNavController, NavHost içindeki ScopedNavController'da sağlanır. NavHost dışında (örneğin, BottomNavigation'da), denetleyici parametreler veya ViewModel aracılığıyla iletilir.
NavHost, NavController'ı rota grafiğine bağlayan bir composable kapsayıcıdır. Her rota, composable(route, arguments, deepLinks) aracılığıyla bildirilir; burada route, isteğe bağlı {param} yer tutucuları olan bir rota dizesidir. Geçerli rota eşleştiğinde, NavHost ilgili composable bloğunu işler.
Rota grafiği hiyerarşik olarak oluşturulur: bir modül içindeki rotaları gruplamak için navigation() aracılığıyla grafikler iç içe yerleştirilebilir. İç içe grafiklerin kendi startDestination'ları vardır ve ortak bir rota öneki altında birleştirilir. Bu, her özellik modülünün kendi alt grafiğini kaydettiği modüler bir mimari düzenlemeye olanak tanır.
NavHost(
navController = navController,
startDestination = "main"
) {
composable("main") { MainScreen(navController) }
navigation(
route = "auth",
startDestination = "auth/login"
) {
composable("auth/login") { LoginScreen(navController) }
composable("auth/register") { RegisterScreen(navController) }
}
}
NavHost, LocalBackDispatcher aracılığıyla sistem Geri düğmesini (geri basma) otomatik olarak işler. Material3 Scaffold'ta, varsayılan olarak doğru BottomNavigation çalışması için NavController'ı alır. NavHost, rota değiştiğinde composable'ı yeniden oluşturur, ancak giriş alanları ve kaydırma için rememberSaveable aracılığıyla durumu korur.
Navigation Compose, rota parametreleri ve NavType aracılığıyla ekranlar arasında tür belirtilmiş argümanların iletilmesini destekler. Parametreler rotada {paramName} olarak belirtilir ve tür, composable() içindeki arguments aracılığıyla gösterilir. NavType, String, Int, Long, Float, Boolean, Parcelable ve Serializable'ı destekler.
| Argüman Türü | NavType | Rota Örneği |
|---|---|---|
| String | NavType.StringType | "profile/{name}" |
| Int | NavType.IntType | "item/{id}" |
| Boolean | NavType.BoolType | "settings?enabled={flag}" |
| Parcelable | NavType.ParcelableType | "details/{item}" |
| Float | NavType.FloatType | "map?lat={lat}&lng={lng}" |
Argümanlar, NavBackStackEntry'den arguments?.getType(key) aracılığıyla çıkarılır. Zorunlu parametreler için defaultValue kullanın, isteğe bağlı olanlar için — nullable. Parcelable desteği yalnızca Kotlin Parcelize veya kotlinx.parcelize kütüphanesi ile çalışır. Karmaşık nesneler için, tüm nesneyi serileştirmek yerine bir kimlik iletmek ve ViewModel aracılığıyla veri yüklemek önerilir.
Navigation 2.8.0 sürümünden itibaren, Kotlin Serialization ile tür güvenli navigasyon tanıtılmıştır: rotalar veri sınıfları olarak ve argümanlar alanlar olarak tanımlanır. Bu, dize rotalarını tür belirtilmiş nesnelerle değiştirir ve rota adlarındaki hataları ortadan kaldırır. Geçiş, Kotlin Serialization eklentisi ve navigation-compose-typesafe bağımlılığını gerektirir.
@Serializable
/* sealed class Route */
sealed class ProfileRoute(val route: String) {
data object Home : ProfileRoute("home")
data class Profile(val userId: String) : ProfileRoute("profile/{userId}")
}
Derin bağlantılar, bir URL veya intent-filter aracılığıyla belirli bir uygulama ekranını açmaya izin veren bir navigasyon mekanizmasıdır. Navigation Compose'da, derin bağlantılar composable() içindeki deepLinks parametresi aracılığıyla yapılandırılır ve URI desenle eşleştiğinde otomatik olarak işlenir.
Derin bağlantı, bir UriPattern listesi olarak belirtilir: "https://example.com/profile/{userId}". URI parametreleri otomatik olarak rota argümanlarına eşlenir. NavController, uygulama başlangıcında (intent aracılığıyla) ve çalışma sırasında (örtük derin bağlantılar aracılığıyla) derin bağlantıları işler. Bekleyen derin bağlantıları işlemek için, grafik başlatma sonrasında NavController'da handleDeepLink() kullanın.
Google'a göre, derin bağlantılar şunlar için önerilir: push bildirimleri (Firebase Dynamic Links), e-posta doğrulama, içerik paylaşımı ve web bağlantılarından çapraz navigasyon. Android 12+ için, derin bağlantı yetkisini doğrulamak üzere Digital Asset Links kullanılır. AndroidManifest.xml, diyalogsuz bağlantıları açmak için autoVerify="true" içeren bir intent-filter içermelidir.
composable(
route = "profile/{userId}",
arguments = listOf(navArgument("userId") { type = NavType.StringType }),
deepLinks = listOf(
navDeepLink { uriPattern = "https://example.com/profile/{userId}" }
)
) { backStackEntry ->
ProfileScreen(userId = backStackEntry.arguments?.getString("userId") ?: "")
}
Navigation Compose'da derin bağlantıların sınırlamaları: kütüphane ertelenmiş derin bağlantıları desteklemez — bir derin bağlantı, yalnızca NavHost grafiği tamamen oluşturduktan sonra işlenir. Grafik başlatmadan önce bir derin bağlantı gelirse, intent?.data aracılığıyla ertelenmeli ve LaunchedEffect içinde işlenmelidir. Firebase Dynamic Links için, Navigation Compose ile birlikte Firebase Dynamic Links SDK'sını kullanın.
Navigation Compose, composable() içindeki enterTransition, exitTransition, popEnterTransition ve popExitTransition parametreleri aracılığıyla geçiş animasyonlarını destekler. Animasyonlar, Compose Animation API kullanılarak uygulanır: fadeIn, slideInHorizontally, expandIn ve diğerleri. Varsayılan olarak, animasyon devre dışıdır — ekranlar anında değiştirilir.
Tipik animasyon senaryoları: ileri navigasyon için slideInHorizontally (ekran sağdan kayar), geri dönüş için slideOutHorizontally (ekran sağa kayar). BottomNavigation için, kaydırmasız solma animasyonu daha yaygın olarak kullanılır. Animasyonlar NavHost aracılığıyla ayarlanır ve bireysel animasyonlar belirtilmedikçe tüm composable'lara uygulanır.
NavHost(
navController = navController,
startDestination = "home",
enterTransition = { slideInHorizontally() + fadeIn() },
exitTransition = { slideOutHorizontally() + fadeOut() },
popEnterTransition = { fadeIn() },
popExitTransition = { slideOutHorizontally() + fadeOut() }
) { /* composable */ }
Animasyon parametreleri doğrudan composable() içinde iletilerek her composable için ayrı ayrı geçersiz kılınabilir. Önemli olarak, animasyonlar sistem geri basma animasyonuyla çakışmamalıdır. Paylaşılan öğe geçişi için, accompanist-navigation-animation kütüphanesi veya Modifier.graphicsLayer aracılığıyla özel uygulama gereklidir. Android Developers'a (2025) göre, üretim uygulamalarının %80'i standart navigasyon için yatay kaydırma animasyonu kullanır.
Sıkça Sorulan Sorular
Navigation Compose, Fragment olmadan çalışır, grafik için composable işlevler ve Kotlin DSL kullanır. Navigasyon Bileşeni (View), FragmentManager ve XML grafiklerine dayanır. Compose sürümü daha basit, daha hızlıdır ve Fragment yaşam döngüsüne sahip değildir. View için Navigasyon Bileşeni yalnızca hibrit uygulamalar için uygundur.
Nesne kimliğini iletmek ve SavedStateHandle ile ViewModel aracılığıyla veri yüklemek önerilir. Nesne basitse, kotlinx.parcelize aracılığıyla Parcelable kullanın. Büyük nesneleri doğrudan argümanlar (Bundle) aracılığıyla iletmek ~1 MB ile sınırlıdır ve TransactionTooLargeException'a neden olabilir.
Evet, NavHost içindeki navigation(route, startDestination) işlevi aracılığıyla. İç içe grafiklerin kendi startDestination'ları vardır ve ortak bir rota öneki altında birleştirilir. Bu, her özellik modülü için izole grafiklerle modüler bir mimari düzenlemeye olanak tanır.
NavController, Compose'tan BackHandler aracılığıyla geri basmayı otomatik olarak işler. Geri basıldığında navController.popBackStack() çağırın. Özel işleme (çıkış onayı) için, popBackStack() çağırmadan önce BackHandler(enabled = condition) { callback } kullanın.
Şu anda, Navigation Compose, Compose Multiplatform'da desteklenmemektedir. Platformlar arası projelerin iOS kısmı için Voyager veya Decompose kullanın. Google KMP desteği üzerinde çalışıyor, ancak yayın takvimi yok. Yalnızca Android projeleri için Navigation Compose önerilen tek seçenektir.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun