Navigation Compose: bu nədir, arxitektura və inkişafda işləmə

Müəllif: IT Sectr Dərc olunub: 2026-06-29 Oxuma vaxtı: 8 dəq

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 NavControllerNavHost 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 — vahid marşrut qrafiki ilə Compose-da deklarativ naviqasiya üçün Jetpack kitabxanası
  • NavController — naviqasiya yığınını və back stack vəziyyətini idarə edən mərkəzi kontroller
  • NavHost — route ilə composable funksiyaları vasitəsilə marşrut qrafikini təyin edən konteyner
  • Arqumentlər NavType və SavedStateHandle vasitəsilə tipləşdirilmiş parametrlər dəstəyi ilə ötürülür
  • Deep Links — URI-dən arqumentlərin avtomatik pars edilməsi ilə xarici URL vasitəsilə naviqasiya

Navigation Compose nədir?

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.

kotlin
@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.

kotlin
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.

Arqumentlərin ekranlar arasında ötürülməsi

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 tipiNavTypeRoute nümunəsi
StringNavType.StringType"profile/{name}"
IntNavType.IntType"item/{id}"
BooleanNavType.BoolType"settings?enabled={flag}"
ParcelableNavType.ParcelableType"details/{item}"
FloatNavType.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.

kotlin
@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.

kotlin
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.

Ekranlar arasında keçid animasiyası

Navigation Compose composable()-da enterTransition, exitTransition, popEnterTransitionpopExitTransition 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.

kotlin
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 View üçün Navigation Component-dən nə ilə fərqlənir?

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.

Ekranlar arasında mürəkkəb obyekti necə ötürmək olar?

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.

Navigation Compose iç-içə qrafikləri dəstəkləyir?

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.

Navigation Compose-da sistem Geri düyməsini necə idarə etmək olar?

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.

Navigation Compose-u Jetpack Compose Multiplatform ilə istifadə etmək olar?

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ə

  • Navigation Compose — marşrut qrafiki və NavController vasitəsilə işləyən Compose-da deklarativ naviqasiya üçün Jetpack kitabxanası
  • NavController back stack-i idarə edir və naviqasiya üçün navigate, popBackStack metodlarını təmin edir
  • NavHost kontrolleri qrafiklə composable() vasitəsilə birləşdirir, modul arxitekturası üçün iç-içə qrafikləri dəstəkləyir
  • Arqumentlər NavType vasitəsilə String, Int, Parcelable və Kotlin Serialization ilə Type-Safe Navigation dəstəyi ilə ötürülür
  • Deep Links URL və push bildirişlərindən xarici naviqasiya üçün UriPattern ilə navDeepLink vasitəsilə konfiqurasiya edilir
  • Animasiya keçidləri enterTransition, exitTransition ilə Compose Animation API istifadə edərək təyin edilir
  • Kitabxana KMP və əlavə konfiqurasiya olmadan BottomNavigation üçün multi-back stack dəstəkləmir

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.

Layihəni müzakirə et

Həm də oxuyun