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 апликације. Библиотека се заснива на истим принципима као 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 након иницијализације графа).
@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-модул региструје свој подграф.
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 |
|---|---|---|
| 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}" |
Аргументи се извлаче из 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.
@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" за отварање веза без дијалога.
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, ако нису наведене појединачне.
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 ради без 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(route, startDestination) унутар NavHost-а. Угнежђени графови имају сопствени startDestination и обједињују се под заједничким route-префиксом. Ово омогућава организовање модуларне архитектуре са изолованим графовима за сваки feature-модул.
NavController аутоматски обрађује back press кроз BackHandler из Compose-а. Позовите navController.popBackStack() при притиску дугмента Назад. За прилагођену обраду (потврда изласка) користите BackHandler(enabled = condition) { callback } пре позива popBackStack().
Тренутно Navigation Compose није подржан у Compose Multiplatform. За iOS део cross-platform пројеката користите Voyager или Decompose. Google ради на подршци за KMP, али рокови објављивања нису познати. За Android-only пројекте, Navigation Compose је једина препоручена опција.
Закључак
Развићемо мобилну апликацију под кључ
IT Sectr креира iOS и Android апликације за стартапе и предузећа од 2017. године. Саветоваћемо вас и предложити најбоље решење.
Прочитајте такође