Navigation Compose: co to je, architektura a fungování ve vývoji

Autor: IT Sectr Publikováno: 2026-06-29 Doba čtení: 8 min

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 — knihovna Jetpack pro deklarativní navigaci v Compose s jednotným grafem tras
  • NavController — centrální řadič spravující zásobník navigace a stav back stack
  • NavHost — kontejner definující graf tras pomocí composable funkcí s route
  • Argumenty se předávají přes NavType a SavedStateHandle s podporou typovaných parametrů
  • Deep Links — navigace přes externí URL s automatickým parsováním argumentů z URI

Co je Navigation Compose?

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

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") ?: ""
            )
        }
    }
}

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.

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

Předávání argumentů mezi obrazovkami

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 argumentuNavTypePříklad 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}"

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.

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

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") ?: "")
}

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.

Animace přechodů mezi obrazovkami

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

kotlin
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

Čím se liší Navigation Compose od Navigation Component pro View?

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.

Jak předat složitý objekt mezi obrazovkami?

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.

Podporuje Navigation Compose vnořené grafy?

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.

Jak zpracovat systémové tlačítko Zpět v Navigation Compose?

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().

Lze použít Navigation Compose s Jetpack Compose Multiplatform?

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í

  • Navigation Compose — knihovna Jetpack pro deklarativní navigaci v Compose, fungující přes graf tras a NavController
  • NavController spravuje back stack a poskytuje metody navigate, popBackStack pro navigaci
  • NavHost propojuje řadič s grafem přes composable(), podporuje vnořené grafy pro modulární architekturu
  • Argumenty se předávají přes NavType s podporou String, Int, Parcelable a Type-Safe Navigation s Kotlin Serialization
  • Deep Links se konfigurují přes navDeepLink s UriPattern pro externí navigaci z URL a push notifikací
  • Animace přechodů se nastavuje přes enterTransition, exitTransition s použitím Compose Animation API
  • Knihovna nepodporuje KMP a multi-back stack pro BottomNavigation bez dodatečné konfigurace

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

Prodiskutovat projekt

Přečtěte si také