Navigation Compose — Jetpack Compose üzərində qurulmuş Android tətbiqləri üçün deklarativ naviqasiya kitabxanasıdır. FragmentManager və ya Intent-based naviqasiyası əvəzinə Navigation Compose NavController və NavHost vasitəsilə idarə olunan vahid marşrut qrafiki təklif edir. Google I/O (2025) məlumatlarına görə, Navigation Compose yeni layihələrin 70%-dən çoxunda istifadə edilən Compose tətbiqləri üçün tövsiyə olunan naviqasiya üsuludur. Kitabxana tipləşdirilmiş arqumentlərin ötürülməsini, dərin keçidləri, keçid animasiyalarını və SavedStateHandle vasitəsilə ViewModel ilə inteqrasiyanı dəstəkləyir.
Əsas məqamlar
Navigation Compose — Compose tətbiqləri üçün naviqasiya çərçivəsi təmin edən Jetpack kitabxanasıdır. Kitabxana View sistemi üçün Navigation Component ilə eyni prinsiplərə əsaslanır, lakin Compose-un deklarativ təbiətinə uyğunlaşdırılıb: FragmentTransaction əvəzinə composable funksiyaları, naviqasiya qrafiki isə Kotlin DSL vasitəsilə qurulur.
Navigation Compose-un klassik naviqasiyadan əsas fərqi — FragmentManager-in olmamasıdır. Hər ekran marşrut uyğunlaşdıqda NavHost-da render olunan composable funksiyasıdır. Back stack Fragment deyil, route, arqumentlər və vəziyyətlə qeyd saxlayır. Bu, arxitekturanı sadələşdirir və Fragment naviqasiyasına xas olan lifecycle konfliktlərini aradan qaldırır.
Google (2025) məlumatlarına görə, Navigation Compose experimental-dan stable-a qədər yol keçib və 2.8.0 versiyasından etibarən Jetpack-ə daxildir. Kitabxana Material3, Type-Safe Navigation (Kotlin Serialization vasitəsilə), iç-içə qrafiklər və modulyarizasiyanı dəstəkləyir. Yeganə məhdudiyyət — əl ilə konfiqurasiya olmadan BottomNavigation üçün multi-back stack dəstəyinin olmamasıdır, baxmayaraq ki, Google bunun üzərində işləyir.
Navigation Compose arxitekturası üç varlıq ətrafında qurulur: NavController (yığının idarə edilməsi), NavHost (qrafik konteyneri) və NavDestination (composable ilə ayrıca marşrut). Onlar arasında qarşılıqlı əlaqə deklarativdir: tərtibatçı marşrutları və arqumentləri təsvir edir, kitabxana isə yükləmə, qoruma və bərpa vəziyyətlərini idarə edir.
NavController — Navigation Compose-un naviqasiya yığınını idarə edən mərkəzi elementidir. rememberNavController() vasitəsilə yaradılır və NavHost-a ötürülür. NavController back stack-i, cari giriş nöqtəsini saxlayır və təxirə salınmış hərəkətləri (qrafik inisializasiyasından sonra deeplink) dəstəkləyir.
@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-un əsas metodları: navigate(route) — marşruta keçid, popBackStack() — əvvəlki ekrana qayıdış, navigateAndClear(route) — yığının təmizlənməsi ilə keçid. NavOptions davranışı müəyyən edir: launchSingleTop təkrarlamanın qarşısını alır, popUpTo yığını göstərilən marşruta qədər təmizləyir, restoreState əvvəlki vəziyyəti bərpa edir.
Dərin iç-içə composable funksiyalarından NavController-a giriş üçün CompositionLocal vasitəsilə NavHostController istifadə edin. LocalNavController NavHost daxilində ScopedNavController-da təmin edilir. NavHost-dan kənarda (məsələn, BottomNavigation-da) kontroller parametrlər və ya ViewModel vasitəsilə ötürülür.
NavHost — NavController-u marşrut qrafiki ilə birləşdirən composable konteynerdir. Hər marşrut composable(route, arguments, deepLinks) vasitəsilə elan edilir, burada route — parametrləri {param} olan marşrut sətridir. Cari marşrut route ilə uyğunlaşdıqda NavHost müvafiq composable blokunu render edir.
Marşrut qrafiki iyerarxik şəkildə qurulur: modul daxilində marşrutların qruplaşdırılması üçün navigation() vasitəsilə qrafiklər iç-içə yerləşdirilə bilər. İç-içə qrafiklərin öz startDestination-ı var və ümumi route-prefiksi altında birləşdirilir. Bu, hər bir feature-modulun öz altqrafikini qeydiyyatdan keçirdiyi modul arxitekturasını təşkil etməyə imkan verir.
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 vasitəsilə sistem Geri düyməsini (back press) avtomatik idarə edir. Material3 Scaffold-da BottomNavigation-un düzgün işləməsi üçün NavController defolt olaraq qəbul edilir. NavHost marşrut dəyişikliyi zamanı composable-ı yenidən yaradır, lakin daxiletmə sahələri və scroll üçün rememberSaveable vasitəsilə vəziyyəti qoruyur.
Navigation Compose marşrut parametrləri və NavType vasitəsilə ekranlar arasında tipləşdirilmiş arqumentlərin ötürülməsini dəstəkləyir. Parametrlər route-da {paramName} kimi composable()-da arguments vasitəsilə tip göstərilməklə təyin edilir. NavType String, Int, Long, Float, Boolean, Parcelable və Serializable dəstəkləyir.
| Arqument tipi | NavType | Route nümunəsi |
|---|---|---|
| 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}" |
Arqumentlər NavBackStackEntry-dən arguments?.getType(key) vasitəsilə çıxarılır. Məcburi parametrlər üçün defaultValue, isteğe bağlı olanlar üçün nullable istifadə edin. Parcelable dəstəyi yalnız Kotlin Parcelize və ya kotlinx.parcelize kitabxanası ilə işləyir. Mürəkkəb obyektlər üçün ID ötürmək və məlumatları ViewModel vasitəsilə yükləmək tövsiyə olunur, bütün obyekti serializasiya etmək yox.
Navigation 2.8.0 versiyasından etibarən Type-Safe Navigation Kotlin Serialization ilə mövcuddur: marşrutlar data-siniflər, arqumentlər isə sahələr kimi təyin edilir. Bu, sətir route-ları tipləşdirilmiş obyektlərlə əvəz edir və marşrut adlarında səhvləri aradan qaldırır. Miqrasiya üçün Kotlin Serialization plugin-i və navigation-compose-typesafe asılılığı tələb olunur.
@Serializable
/* sealed class Route */
sealed class ProfileRoute(val route: String) {
data object Home : ProfileRoute("home")
data class Profile(val userId: String) : ProfileRoute("profile/{userId}")
}
Deep Links — URL və ya intent-filter vasitəsilə tətbiqin müəyyən ekranını açmağa imkan verən naviqasiya mexanizmidir. Navigation Compose-da dərin keçidlər composable()-da deepLinks parametri vasitəsilə konfiqurasiya edilir və URI nümunəyə uyğunlaşdıqda avtomatik işlənir.
Deep Link UriPattern siyahısı kimi təyin edilir: "https://example.com/profile/{userId}". URI-dən parametrlər avtomatik olaraq marşrut arqumentlərinə xəritələnir. NavController dərin keçidi tətbiqin işə salınması zamanı (intent vasitəsilə) və iş zamanı (implicit deep links vasitəsilə) idarə edir. Gözləyən dərin keçidlərin işlənməsi üçün qrafik inisializasiyasından sonra NavController-da handleDeepLink() istifadə olunur.
Google-a görə, dərin keçidlərin konfiqurasiyası tövsiyə olunur: push bildirişləri (Firebase Dynamic Links), e-poçt təsdiqi, məzmun paylaşımı və veb-linklərdən naviqasiya üçün. Android 12+ üçün dərin keçidin səlahiyyətinin təsdiqlənməsi üçün Digital Asset Links istifadə olunur. AndroidManifest.xml linklərin dialogsız açılması üçün autoVerify="true" ilə intent-filter ehtiva etməlidir.
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 dərin keçid məhdudiyyətləri: kitabxana təxirə salınmış dərin keçidləri dəstəkləmir — dərin keçid yalnız NavHost qrafiki tam qurduqdan sonra işlənir. Əgər dərin keçid qrafikin inisializasiyasından əvvəl gələrsə, onu intent?.data vasitəsilə təxirə salmaq və LaunchedEffect-də işləmək lazımdır. Firebase Dynamic Links üçün Navigation Compose ilə birlikdə Firebase Dynamic Links SDK-dan istifadə edin.
Navigation Compose composable()-da enterTransition, exitTransition, popEnterTransition və popExitTransition parametrləri vasitəsilə keçid animasiyasını dəstəkləyir. Animasiyalar Compose Animation API vasitəsilə həyata keçirilir: fadeIn, slideInHorizontally, expandIn və s. Defolt olaraq animasiya söndürülüb — ekranlar dərhal əvəz olunur.
Tipik animasiya ssenariləri: irəli naviqasiya üçün slideInHorizontally (ekran sağdan daxil olur), qayıdış üçün slideOutHorizontally (ekran sağa çıxır). BottomNavigation üçün daha çox sürüşməsiz fade animasiyası istifadə olunur. Animasiyalar NavHost vasitəsilə təyin edilir və fərdi olaraq göstərilməyibsə, bütün composable-lara tətbiq olunur.
NavHost(
navController = navController,
startDestination = "home",
enterTransition = { slideInHorizontally() + fadeIn() },
exitTransition = { slideOutHorizontally() + fadeOut() },
popEnterTransition = { fadeIn() },
popExitTransition = { slideOutHorizontally() + fadeOut() }
) { /* composable */ }
Animasiyalar hər composable üçün fərdi şəkildə, animasiya parametrlərini birbaşa composable()-da ötürməklə dəyişdirilə bilər. Vacibdir: animasiyalar sistemin geri düyməsi animasiyası ilə ziddiyyət təşkil etməməlidir. Shared element transition üçün accompanist-navigation-animation kitabxanası və ya Modifier.graphicsLayer vasitəsilə xüsusi tətbiq tələb olunur. Android Developers (2025) məlumatlarına görə, istehsal tətbiqlərinin 80%-i standart naviqasiya üçün üfüqi slide animasiyasından istifadə edir.
Tez-tez verilən suallar
Navigation Compose Fragment olmadan işləyir, qrafik üçün composable funksiyaları və Kotlin DSL istifadə edir. Navigation Component (View) FragmentManager və XML qrafiklərinə əsaslanır. Compose versiyası daha sadə, daha sürətlidir və Fragment lifecycle-larına malik deyil. View üçün Navigation Component yalnız hibrid tətbiqlər üçün uyğundur.
Obyektin ID-sini ötürmək və məlumatları SavedStateHandle ilə ViewModel vasitəsilə yükləmək tövsiyə olunur. Obyekt sadədirsə — kotlinx.parcelize vasitəsilə Parcelable istifadə edin. Böyük obyektlərin birbaşa arqumentlər (Bundle) vasitəsilə ötürülməsi ~1 MB limitlə məhduddur və TransactionTooLargeException-a səbəb ola bilər.
Bəli, NavHost daxilində navigation(route, startDestination) funksiyası vasitəsilə. İç-içə qrafiklərin öz startDestination-ı var və ümumi route-prefiksi altında birləşdirilir. Bu, hər bir feature-modul üçün izolə edilmiş qrafiklərlə modul arxitekturasını təşkil etməyə imkan verir.
NavController Compose-dan BackHandler vasitəsilə back press-i avtomatik idarə edir. Geri düyməsi basıldıqda navController.popBackStack() çağırın. Xüsusi idarəetmə üçün (çıxışın təsdiqi) popBackStack() çağırışından əvvəl BackHandler(enabled = condition) { callback } istifadə edin.
Hazırda Navigation Compose dəstəklənmir Compose Multiplatform-da. Çarpaz platformalı layihələrin iOS hissəsi üçün Voyager və ya Decompose istifadə edin. Google KMP dəstəyi üzərində işləyir, lakin buraxılış tarixləri yoxdur. Yalnız Android layihələri üçün Navigation Compose yeganə tövsiyə olunan variantdır.
Nəticə
Açar təslim mobil tətbiq hazırlayacağıq
IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.
Həm də oxuyun