Navigation Compose: шта је то, архитектура и рад у развоју

Аутор: IT Sectr Објављено: 2026-06-29 Време читања: 8 мин

Navigation Compose — је библиотека Jetpack за декларативну навигацију унутар Android апликација изграђених на Jetpack Compose. Уместо FragmentManager или Intent-based навигације, Navigation Compose нуди јединствени граф рута којим управљају NavController и NavHost. Према подацима Google I/O (2025), Navigation Compose је препоручени начин навигације за Compose апликације, који се користи у више од 70% нових пројеката. Библиотека подржава пренос типизираних аргумената, дубоке везе, анимацију прелаза и интеграцију са ViewModel преко SavedStateHandle.

Главне тачке

  • Navigation Compose — Jetpack библиотека за декларативну навигацију у Compose са јединственим графом рута
  • NavController — централни контролер који управља стеком навигације и стањем back stack
  • NavHost — контејнер који дефинише граф рута кроз composable функције са route
  • Аргументи се преносе преко NavType и SavedStateHandle уз подршку за типизиране параметре
  • Deep Links — навигација кроз спољашње URL-ове са аутоматским парсирањем аргумената из URI

Шта је Navigation Compose?

Navigation Compose — је библиотека из састава Jetpack, која пружа навигациони оквир за Compose апликације. Библиотека се заснива на истим принципима као Navigation Component за View систем, али је прилагођена декларативној природи Compose: уместо FragmentTransaction користе се composable функције, а граф навигације се гради кроз Kotlin DSL.

Кључна разлика између Navigation Compose и класичне навигације — одсуство FragmentManager. Сваки екран је composable функција која се рендерује у NavHost при поклапању руте. Back stack чува не Fragment, већ запис са route, аргументима и стањем. Ово поједностављује архитектуру и елиминише lifecycle конфликте карактеристичне за Fragment навигацију.

Према подацима Google (2025), Navigation Compose је прешао пут од experimental до stable и улази у састав Jetpack од верзије 2.8.0. Библиотека подржава Material3, Type-Safe Navigation (кроз Kotlin Serialization), угнежђене графове и модуларизацију. Једино ограничење — библиотека не подржава multi-back stack за BottomNavigation без ручног подешавања, иако Google ради на томе.

Архитектура Navigation Compose се гради око три ентитета: NavController (управљање стеком), NavHost (контејнер графа) и NavDestination (појединачна рута са composable). Интеракција између њих је декларативна: програмер описује руте и аргументе, а библиотека обрађује стања учитавања, чувања и враћања.

NavController — централни елемент Navigation Compose, који управља навигационим стеком. Креира се кроз rememberNavController() и прослеђује се NavHost-у. NavController чува back stack, тренутну тачку уласка и подржава одложене акције (deeplink након иницијализације графа).

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: navigate(route) — прелазак на руту, popBackStack() — повратак на претходни екран, navigateAndClear(route) — прелазак уз чишћење стека. NavOptions одређују понашање: launchSingleTop спречава дуплирање, popUpTo чисти стек до наведене руте, restoreState враћа претходно стање.

За приступ NavController-у из дубоко угнежђених composable функција користите NavHostController кроз CompositionLocal. LocalNavController се обезбеђује у ScopedNavController унутар NavHost-а. Изван NavHost-а (нпр. у BottomNavigation) контролер се прослеђује кроз параметре или ViewModel.

NavHost — је composable контејнер који повезује NavController са графом рута. Свака рута се декларише кроз composable(route, arguments, deepLinks), где је route низ руте са опционим чуварима места {param}. При поклапању тренутне руте са route, NavHost рендерује одговарајући composable блок.

Граф рута се гради хијерархијски: могуће је угнежђивати графове кроз navigation() за груписање рута унутар модула. Угнежђени графови имају сопствени startDestination и обједињују се под заједничким route-префиксом. Ово омогућава организовање модуларне архитектуре, где сваки feature-модул региструје свој подграф.

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 аутоматски обрађује системско дугме Назад (back press) кроз LocalBackDispatcher. У Material3 Scaffold подразумевано преузима NavController за коректан рад BottomNavigation. NavHost поново креира composable при промени руте, али чува стање кроз rememberSaveable за поља за унос и скроловање.

Пренос аргумената између екрана

Navigation Compose подржава пренос типизираних аргумената између екрана кроз параметре руте и NavType. Параметри се задају у route као {paramName} са навођењем типа кроз arguments у composable(). NavType подржава String, Int, Long, Float, Boolean, Parcelable и Serializable.

Тип аргументаNavTypeПример route
StringNavType.StringType"profile/{name}"
IntNavType.IntType"item/{id}"
BooleanNavType.BoolType"settings?enabled={flag}"
ParcelableNavType.ParcelableType"details/{item}"
FloatNavType.FloatType"map?lat={lat}&lng={lng}"

Аргументи се извлаче из NavBackStackEntry кроз arguments?.getType(key). За обавезне параметре користите defaultValue, за опционе — nullable. Подршка за Parcelable ради само са Kotlin Parcelize или библиотеком kotlinx.parcelize. За сложене објекте препоручује се пренос ID-а и учитавање података кроз ViewModel, а не серијализација целог објекта.

Од верзије Navigation 2.8.0 доступна је Type-Safe Navigation са Kotlin Serialization: руте се дефинишу као data-класе, а аргументи као поља. Ово замењује низне route типизираним објектима и елиминише грешке у именима рута. За миграцију је потребан plugin Kotlin Serialization и зависност navigation-compose-typesafe.

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-а или intent-filter-а. У Navigation Compose дубоке везе се подешавају кроз параметар deepLinks у composable() и обрађују се аутоматски при поклапању URI са шаблоном.

Deep Link се задаје као листа UriPattern: "https://example.com/profile/{userId}". Параметри из URI се аутоматски мапирају у аргументе руте. NavController обрађује дубоку везу при покретању апликације (кроз intent) и у току рада (кроз implicit deep links). За обраду чекајућих дубоких веза користи се handleDeepLink() у NavController-у након иницијализације графа.

Према Google-у, дубоке везе се препоручују за: push обавештења (Firebase Dynamic Links), верификацију имејла, дељење садржаја и навигацију из web веза. За Android 12+ користи се Digital Asset Links за верификацију ауторитативности дубоке везе. AndroidManifest.xml мора да садржи intent-filter са autoVerify="true" за отварање веза без дијалога.

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: библиотека не подржава одложене дубоке везе — дубока веза се обрађује тек након што NavHost потпуно изгради граф. Ако дубока веза стигне пре иницијализације графа, треба је одложити кроз intent?.data и обрадити у LaunchedEffect. За Firebase Dynamic Links користите Firebase Dynamic Links SDK у комбинацији са Navigation Compose.

Анимација прелаза између екрана

Navigation Compose подржава анимацију прелаза кроз параметре enterTransition, exitTransition, popEnterTransition и popExitTransition у composable(). Анимације се реализују кроз Compose Animation API: fadeIn, slideInHorizontally, expandIn и друге. Подразумевано, анимација је искључена — екрани се замењују тренутно.

Типични сценарији анимације: slideInHorizontally за навигацију напред (екран улази са десне стране), slideOutHorizontally за повратак (екран излази на десну страну). За BottomNavigation се чешће користи fade анимација без померања. Анимације се подешавају кроз NavHost и примењују се на све composable, ако нису наведене појединачне.

kotlin
NavHost(
    navController = navController,
    startDestination = "home",
    enterTransition = { slideInHorizontally() + fadeIn() },
    exitTransition = { slideOutHorizontally() + fadeOut() },
    popEnterTransition = { fadeIn() },
    popExitTransition = { slideOutHorizontally() + fadeOut() }
) { /* composable */ }

Анимације се могу премостити за сваки composable појединачно, прослеђивањем анимационих параметара директно у composable(). Важно: анимације не смеју да буду у конфликту са системском анимацијом back press. За shared element transition потребна је библиотека accompanist-navigation-animation или прилагођена имплементација кроз Modifier.graphicsLayer. Према Android Developers (2025), 80% производних апликација користи хоризонталну slide анимацију за стандардну навигацију.

Често постављана питања

По чему се Navigation Compose разликује од Navigation Component за View?

Navigation Compose ради без Fragment-а, користећи composable функције и Kotlin DSL за граф. Navigation Component (View) се заснива на FragmentManager-у и XML графовима. Compose верзија је једноставнија, бржа и нема lifecycle-ове Fragment-а. Navigation Component за View је погодан само за хибридне апликације.

Како пренети сложени објекат између екрана?

Препоручује се пренос ID-а објекта и учитавање података кроз ViewModel са SavedStateHandle. Ако је објекат једноставан — користите Parcelable кроз kotlinx.parcelize. Пренос великих објеката директно кроз аргументе (Bundle) је ограничен на ~1 MB и може изазвати TransactionTooLargeException.

Да ли Navigation Compose подржава угнежђене графове?

Да, кроз функцију navigation(route, startDestination) унутар NavHost-а. Угнежђени графови имају сопствени startDestination и обједињују се под заједничким route-префиксом. Ово омогућава организовање модуларне архитектуре са изолованим графовима за сваки feature-модул.

Како обрадити системско дугме Назад у Navigation Compose?

NavController аутоматски обрађује back press кроз BackHandler из Compose-а. Позовите navController.popBackStack() при притиску дугмента Назад. За прилагођену обраду (потврда изласка) користите BackHandler(enabled = condition) { callback } пре позива popBackStack().

Може ли се Navigation Compose користити са Jetpack Compose Multiplatform?

Тренутно Navigation Compose није подржан у Compose Multiplatform. За iOS део cross-platform пројеката користите Voyager или Decompose. Google ради на подршци за KMP, али рокови објављивања нису познати. За Android-only пројекте, Navigation Compose је једина препоручена опција.

Закључак

  • Navigation Compose — Jetpack библиотека за декларативну навигацију у Compose, која ради кроз граф рута и NavController
  • NavController управља back stack-ом и пружа методе navigate, popBackStack за навигацију
  • NavHost повезује контролер са графом кроз composable(), подржавајући угнежђене графове за модуларну архитектуру
  • Аргументи се преносе кроз NavType уз подршку за String, Int, Parcelable и Type-Safe Navigation са Kotlin Serialization
  • Deep Links се подешавају кроз navDeepLink са UriPattern за спољашњу навигацију из URL-а и push обавештења
  • Анимација прелаза се подешава кроз enterTransition, exitTransition коришћењем Compose Animation API
  • Библиотека не подржава KMP и multi-back stack за BottomNavigation без додатног подешавања

Развићемо мобилну апликацију под кључ

IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.

Разговарајте о пројекту

Прочитајте такође