Navigation Compose — je knihovna Jetpack pro deklarativní navigaci v aplikacích pro Android postavených na Jetpack Compose. Místo FragmentManager nebo navigace založené na Intent, Navigation Compose nabízí jednotný graf tras spravovaný prostřednictvím NavController a NavHost. Podle údajů Google I/O (2025) je Navigation Compose doporučeným způsobem navigace pro aplikace Compose, používaným ve více než 70% nových projektů. Knihovna podporuje předávání typovaných argumentů, hluboké odkazy, animace přechodů a integraci s ViewModel přes SavedStateHandle.
Hlavní body
Navigation Compose — je knihovna ze sady Jetpack, která poskytuje navigační rámec pro aplikace Compose. Knihovna je založena na stejných principech jako Navigation Component pro systém View, ale je přizpůsobena deklarativní povaze Compose: místo FragmentTransaction se používají composable funkce a graf navigace se staví pomocí Kotlin DSL.
Klíčový rozdíl mezi Navigation Compose a klasickou navigací — absence FragmentManager. Každá obrazovka je composable funkce, která se vykresluje v NavHost při shodě trasy. Back stack neukládá Fragment, ale záznam s route, argumenty a stavem. To zjednodušuje architekturu a eliminuje konflikty životního cyklu typické pro Fragment navigaci.
Podle údajů Google (2025) urazil Navigation Compose cestu od experimental k stable a je součástí Jetpack od verze 2.8.0. Knihovna podporuje Material3, Type-Safe Navigation (přes Kotlin Serialization), vnořené grafy a modularizaci. Jediné omezení — knihovna nepodporuje multi-back stack pro BottomNavigation bez ruční konfigurace, i když Google na tom pracuje.
Architektura Navigation Compose je postavena kolem tří entit: NavController (správa zásobníku), NavHost (kontejner grafu) a NavDestination (jednotlivá trasa s composable). Interakce mezi nimi je deklarativní: vývojář popisuje trasy a argumenty, knihovna zpracovává stavy načítání, uchovávání a obnovy.
NavController — centrální prvek Navigation Compose, který spravuje navigační zásobník. Vytváří se pomocí rememberNavController() a předává se do NavHost. NavController ukládá back stack, aktuální vstupní bod a podporuje odložené akce (deeplink po inicializaci grafu).
@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") ?: ""
)
}
}
}
Hlavní metody NavController: navigate(route) — navigace na trasu, popBackStack() — návrat na předchozí obrazovku, navigateAndClear(route) — navigace s vyčištěním zásobníku. NavOptions určují chování: launchSingleTop zabraňuje duplikaci, popUpTo čistí zásobník až k zadané trase, restoreState obnovuje předchozí stav.
Pro přístup k NavController z hluboce vnořených composable funkcí použijte NavHostController přes CompositionLocal. LocalNavController je poskytován v ScopedNavController uvnitř NavHost. Mimo NavHost (např. v BottomNavigation) se řadič předává přes parametry nebo ViewModel.
NavHost — je composable kontejner, který propojuje NavController s grafem tras. Každá trasa je deklarována pomocí composable(route, arguments, deepLinks), kde route je řetězec trasy s volitelnými zástupnými znaky {param}. Při shodě aktuální trasy s route, NavHost vykresluje odpovídající composable blok.
Graf tras se staví hierarchicky: grafy lze vnořovat pomocí navigation() pro seskupení tras v rámci modulu. Vnořené grafy mají vlastní startDestination a jsou sjednoceny pod společnou prefix route. To umožňuje uspořádání modulární architektury, kde každý feature-modul registruje svůj podgraf.
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 automaticky zpracovává systémové tlačítko Zpět (back press) přes LocalBackDispatcher. V Material3 Scaffold standardně přebírá NavController pro správnou funkci BottomNavigation. NavHost znovu vytváří composable při změně trasy, ale uchovává stav přes rememberSaveable pro vstupní pole a scrollování.
Navigation Compose podporuje předávání typovaných argumentů mezi obrazovkami pomocí parametrů trasy a NavType. Parametry se definují v route jako {paramName} s uvedením typu přes arguments v composable(). NavType podporuje String, Int, Long, Float, Boolean, Parcelable a Serializable.
| Typ argumentu | NavType | Příklad 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}" |
Argumenty se získávají z NavBackStackEntry přes arguments?.getType(key). Pro povinné parametry použijte defaultValue, pro volitelné — nullable. Podpora Parcelable funguje pouze s Kotlin Parcelize nebo knihovnou kotlinx.parcelize. Pro složité objekty se doporučuje předávání ID a načítání dat přes ViewModel, nikoli serializace celého objektu.
Od verze Navigation 2.8.0 je k dispozici Type-Safe Navigation s Kotlin Serialization: trasy jsou definovány jako datové třídy, argumenty jako pole. To nahrazuje řetězcové route typovanými objekty a eliminuje chyby v názvech tras. Pro migraci je vyžadován plugin Kotlin Serialization a závislost 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 — mechanismus navigace umožňující otevřít konkrétní obrazovku aplikace přes URL nebo intent-filter. V Navigation Compose se hluboké odkazy konfigurují pomocí parametru deepLinks v composable() a zpracovávají se automaticky při shodě URI se vzorem.
Deep Link se definuje jako seznam UriPattern: "https://example.com/profile/{userId}". Parametry z URI se automaticky mapují na argumenty trasy. NavController zpracovává hluboký odkaz při spuštění aplikace (přes intent) a během provozu (přes implicitní deep links). Pro zpracování čekajících hlubokých odkazů se používá handleDeepLink() v NavController po inicializaci grafu.
Podle Google se konfigurace hlubokých odkazů doporučuje pro: push notifikace (Firebase Dynamic Links), ověření emailu, sdílení obsahu a navigaci z webových odkazů. Pro Android 12+ se používají Digital Asset Links pro ověření autority hlubokého odkazu. AndroidManifest.xml musí obsahovat intent-filter s autoVerify="true" pro otevírání odkazů bez dialogu.
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") ?: "")
}
Omezení hlubokých odkazů v Navigation Compose: knihovna nepodporuje odložené hluboké odkazy — hluboký odkaz je zpracován až po úplném sestavení grafu NavHost. Pokud hluboký odkaz dorazí před inicializací grafu, je třeba jej odložit přes intent?.data a zpracovat v LaunchedEffect. Pro Firebase Dynamic Links používejte Firebase Dynamic Links SDK v kombinaci s Navigation Compose.
Navigation Compose podporuje animaci přechodů pomocí parametrů enterTransition, exitTransition, popEnterTransition a popExitTransition v composable(). Animace jsou implementovány pomocí Compose Animation API: fadeIn, slideInHorizontally, expandIn a další. Ve výchozím nastavení je animace vypnuta — obrazovky se nahrazují okamžitě.
Typické scénáře animace: slideInHorizontally pro navigaci vpřed (obrazovka vjíždí zprava), slideOutHorizontally pro návrat (obrazovka vyjíždí doprava). Pro BottomNavigation se častěji používá fade animace bez posunu. Animace se nastavují přes NavHost a aplikují se na všechny composable, pokud nejsou specifikovány jednotlivé.
NavHost(
navController = navController,
startDestination = "home",
enterTransition = { slideInHorizontally() + fadeIn() },
exitTransition = { slideOutHorizontally() + fadeOut() },
popEnterTransition = { fadeIn() },
popExitTransition = { slideOutHorizontally() + fadeOut() }
) { /* composable */ }
Animace lze přepsat pro každý composable jednotlivě předáním parametrů animace přímo v composable(). Důležité: animace by neměly kolidovat se systémovou animací back press. Pro shared element transition je vyžadována knihovna accompanist-navigation-animation nebo vlastní implementace přes Modifier.graphicsLayer. Podle Android Developers (2025) používá 80% produkčních aplikací horizontální slide animaci pro standardní navigaci.
Často kladené otázky
Navigation Compose pracuje bez Fragmentu, používá composable funkce a Kotlin DSL pro graf. Navigation Component (View) je založen na FragmentManager a XML grafech. Verze Compose je jednodušší, rychlejší a nemá životní cykly Fragment. Navigation Component pro View je vhodný pouze pro hybridní aplikace.
Doporučuje se předávání ID objektu a načítání dat přes ViewModel s SavedStateHandle. Pokud je objekt jednoduchý — použijte Parcelable přes kotlinx.parcelize. Přímé předávání velkých objektů přes argumenty (Bundle) je omezeno na ~1 MB a může způsobit TransactionTooLargeException.
Ano, pomocí funkce navigation(route, startDestination) uvnitř NavHost. Vnořené grafy mají vlastní startDestination a jsou sjednoceny pod společnou prefix route. To umožňuje uspořádání modulární architektury s izolovanými grafy pro každý feature-modul.
NavController automaticky zpracovává back press přes BackHandler z Compose. Zavolejte navController.popBackStack() při stisknutí tlačítka Zpět. Pro vlastní zpracování (potvrzení odchodu) použijte BackHandler(enabled = condition) { callback } před voláním popBackStack().
V současné době není Navigation Compose podporován v Compose Multiplatform. Pro iOS část cross-platform projektů používejte Voyager nebo Decompose. Google pracuje na podpoře KMP, ale termíny vydání nejsou známy. Pro projekty pouze pro Android je Navigation Compose jedinou doporučenou možností.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také