NavHost — mi ez, gráf felépítése és útvonalak Jetpack Compose-ban

Szerző: IT Sectr Megjelenés: 2026-06-30 Olvasási idő: 7 perc

A NavHost egy composable konténer, amely belépési pontként szolgál a navigációs gráfhoz Jetpack Compose-ban. Összeköti a NavController-t egy útvonalkészlettel, és a back stack állapotától függően megjeleníti az aktuális képernyőt. Az Android Developers (2025) szerint a NavHost kötelező komponens minden navigációval rendelkező Compose alkalmazásban. A NavHost-on belül composable útvonalak regisztrálhatók opcionális argumentumokkal, deep linkekkel és animációval. Minden útvonal egy közönséges composable függvény, amely NavBackStackEntry-t kap az átmenet adataival. A NavHost automatikusan kezeli a back press-t, az állapotmentést és a visszaállítást rekonfigurációkor.

Főbb pontok

  • NavHost — composable konténer, amely összeköti a NavController-t az útvonalgráffal és megjeleníti az aktuális képernyőt
  • composable() — útvonal regisztrációs függvény route-tal, argumentumokkal, deep linkekkel és átmeneti animációval
  • startDestination — a NavHost létrehozásakor megnyíló kezdeti útvonal
  • Argumentumok navArgument segítségével definiálhatók NavType-pal a tipizált adatátvitelhez a képernyők között
  • Animáció globálisan vagy egyedileg konfigurálható az enterTransition, exitTransition paraméterekkel

Mi az a NavHost Jetpack Compose-ban?

NavHost egy composable függvény, amely konténert biztosít az aktuális navigációs képernyő megjelenítéséhez. A NavHost elfogad egy NavController-t, startDestination-t és a Kotlin DSL segítségével felépített útvonalgráfot. Amikor az aktuális útvonal megváltozik, a NavHost átkapcsolja a megjelenített composable-t a megadott animációval.

A NavHost képernyőkapcsolóként működik: követi az aktuális NavBackStackEntry-t a NavController-ből, és megjeleníti a megfelelő composable blokkot. Minden képernyő egy független composable függvény, amely NavBackStackEntry-t kap az útvonal argumentumaival. Az összes képernyő egyetlen kompozíciós fában létezik, de a NavHost egyszerre csak egyet jelenít meg, a többit animációval elrejtve.

A FragmentManager-rel ellentétben a NavHost nem hoz létre Fragment-et minden képernyőhöz. A teljes életciklus a CompositionLifecycle-en keresztül történik — a composable függvényeknek nincs onStart/onResume-jük, ezért a mellékhatásokhoz LaunchedEffect és DisposableEffect használatos. A NavHost automatikusan feliratkozik a NavController-re, és útvonalváltáskor újrakomponálja a UI-t.

A Google szerint a NavHost stabil API a Navigation 2.4.0 verzió óta. A 2.8.0-tól kezdve a NavHost támogatja a Type-Safe Navigation-t Kotlin Serialization segítségével, ami a string route-okat data osztályokkal váltja fel. A NavHost a beágyazott gráfokat is támogatja, lehetővé téve a navigáció modulonkénti szervezését.

A NavHost két kötelező paraméterrel jön létre: navController (NavHostController példány) és startDestination (az első képernyő útvonalának string-je). A harmadik paraméter a builder blokk, amelyben az összes útvonal regisztrálásra kerül a composable(), navigation() és dialog() segítségével.

kotlin
@Composable
fun AppNavHost(navController: NavHostController) {
    NavHost(
        navController = navController,
        startDestination = "home"
    ) {
        composable("home") { HomeScreen(navController) }
        composable("settings") { SettingsScreen(navController) }
    }
}

A startDestination az az útvonal, amely a NavHost első indításakor megnyílik. Ha a back stack üres, a NavHost automatikusan hozzáadja a startDestination-t a veremhez. Rekonfigurációkor (képernyőelforgatás) a NavHost az utolsó útvonalat állítja vissza a savedState-ből, nem a startDestination-t.

A BottomNavigation esetében a startDestination az alsó panel egyik útvonala. A panel többi útvonala külön composable bejegyzésként kerül hozzáadásra. A NavHost-t a Scaffold.content-en belül kell elhelyezni — ahol az alkalmazás fő tartalma megjelenik. A NavHost a Teljes rendelkezésre álló magasságot elfoglalja, mínusz a TopAppBar és a BottomNavigation.

Útvonalak regisztrálása composable segítségével

A composable(route, arguments, deepLinks, enterTransition, exitTransition, content) függvény regisztrál egy útvonalat a NavHost gráfban. A route paraméter egy string, amely az elérési utat írja le opcionális {paramName} formátumú helyőrzőkkel. A helyőrző navigációkor konkrét értékre cserélődik.

A content blokk NavBackStackEntry-t kap, amelyből az argumentumok kinyerhetők. A képernyő composable függvénye csak akkor jelenik meg, ha a NavController aktuális útvonala megegyezik a route-tal. Eltérés esetén a composable eltávolításra kerül a kompozícióból, de állapota menthető a rememberSaveable vagy ViewModel SavedStateHandle segítségével.

kotlin
composable(
    route = "article/{articleId}",
    arguments = listOf(navArgument("articleId") {
        type = NavType.IntType
        defaultValue = 0
    }),
    deepLinks = listOf(navDeepLink { uriPattern = "https://app.example/article/{articleId}" })
) { backStackEntry ->
    val articleId = backStackEntry.arguments?.getInt("articleId") ?: 0
    ArticleScreen(articleId = articleId)
}

A NavHost-on belüli composable bejegyzések száma bármennyi lehet — néhánytól a százakig. Nagy alkalmazások esetén az útvonalak modulonként vannak felosztva és beágyazott gráfokon keresztül csatlakoztatva. Minden composable rendelkezhet saját animációs, deep link és argumentum beállításokkal.

Argumentumok és tipizált útvonalparaméterek

Az útvonal argumentumai a arguments: List<NamedNavArgument> paraméterrel definiálhatók a composable()-ban. Minden argumentum a navArgument(name) { type; defaultValue } segítségével adható meg. A NavType határozza meg az argumentum típusát: StringType, IntType, LongType, FloatType, BoolType, ParcelableType és ReferenceType.

Útvonal paraméterPélda routeNavType
Elérési út (path)„user/{id}"NavType.IntType
Lekérdezés (query)„search?q={query}"NavType.StringType
Opcionális„details/{id}?tab={tab}"StringType + defaultValue=""
Parcelable„checkout/{order}"NavType.ParcelableType

Az argumentumok a NavBackStackEntry-ből nyerhetők ki a arguments?.getInt("id") segítségével. Kötelező argumentumok esetén a defaultValue elhagyható — a NavType null-t fog használni. Opcionális argumentumoknál a defaultValue kötelező, különben a navigáció kivételt dob a paraméter hiányakor.

A Navigation 2.8.0 verziótól kezdve ajánlott a Type-Safe Navigation: definiáljon sealed class vagy data class útvonalakat Kotlin Serialization segítségével. String route helyett használja a composable<RouteType> { backStackEntry -> } formát. Ez kiküszöböli a gépelési hibákat a route-ban, és automatikusan generál NavType-ot az argumentumokhoz. A migrációhoz adja hozzá a navigation-compose-typesafe függőséget és a Kotlin Serialization plugint.

Beágyazott navigációs gráfok

nested graphs — az útvonalak csoportosításának mechanizmusa a NavHost-on belül a navigation(route, startDestination) függvény segítségével. A beágyazott gráfnak saját route előtagja és startDestination-ja van, és minden útvonala az előtagon keresztül érhető el. A nested graphs moduláris architektúrához használatos, ahol minden feature modul regisztrálja a saját algráfját.

A beágyazott gráfok előnyei: az útvonalak elkülönítése a modulon belül, egységes back stack a képernyőcsoport számára, navigációs lehetőség előtag alapján a belső szerkezet felfedése nélkül. Például az „auth" gráf tartalmazza az „auth/login" és „auth/register" útvonalakat. A navigáció lehetséges a teljes útvonalon, valamint az előtagon keresztül átirányítással a startDestination-ra.

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

A nested graphs támogatják az argumentumok továbbítását gráf szinten: a gráf route-jában deklarált paraméterek az összes belső útvonalra továbbítódnak. A beágyazott gráf törléséhez használja a popBackStack(route) függvényt — ez eltávolítja az összes belső bejegyzést. A beágyazott gráfoknak nincs mélységkorlátja, de az olvashatóság érdekében legfeljebb 3 szint ajánlott.

Animáció és átmenetek testreszabása

A NavHost támogatja az átmeneti animációt a composable útvonalak között a enterTransition, exitTransition, popEnterTransition és popExitTransition paraméterek segítségével. Az animációk egyszer definiálhatók a NavHost számára, és az összes útvonalra alkalmazódnak, vagy egyedileg minden composable-ra. Alapértelmezés szerint az animáció ki van kapcsolva.

Tipikus konfiguráció: enterTransition = slideInHorizontally(initialOffsetX = { it }) — a képernyő jobbról érkezik; exitTransition = slideOutHorizontally(targetOffsetX = { -it }) — a képernyő balra távozik. Pop animáció esetén az irányok tükrözöttek: a képernyő balról érkezik és jobbra távozik. A BottomNavigation esetében fadeIn/fadeOut használatos slide nélkül.

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

Egyedi animációk a Compose Animation API segítségével hozhatók létre: az AnimatedContentTransitionScope hozzáférést biztosít a konténer méreteihez, az animáció előrehaladásához és az irányhoz. A shared element transition (egy elem zökkenőmentes átmenete egy másik képernyőre) esetén az Accompanist Navigation Animation könyvtár vagy egyedi implementáció szükséges a sharedElement Modifier segítségével. Az Android Developers (2025) szerint az alapértelmezett slide animáció (jobbról érkezés, balra távozás) a navigációval rendelkező Android alkalmazások 80%-ában használatos.

Gyakran Ismételt Kérdések

Használható több NavHost egyetlen Activity-ben?

Technikailag igen, de nem ajánlott. Minden NavHost független back stack-et hoz létre, ami megtöri az egységes navigációt. Kivételt képeznek a különálló területek, például NavHost a fő tartalomhoz és NavHost a saját navigációval rendelkező BottomSheet-hez.

Mi a különbség a NavHost és a Scaffold között Compose-ban?

NavHost — navigációs konténer, amely váltja a képernyőket. Scaffold — a teljes oldal elrendezése (TopAppBar, BottomNavigation, FloatingActionButton). Általában a NavHost a Scaffold.content-en belül helyezkedik el. A Scaffold nem kezeli a navigációt, csak slotokat biztosít az UI komponensek számára.

Hogyan lehet ViewModel-t átadni a képernyők között a NavHost segítségével?

A ViewModel a NavBackStackEntry keretein belül jön létre a viewModel() segítségével. A ViewModel megosztásához a képernyők között használja a parentNavController-t: csatolja a megosztott ViewModel-t a szülő entry-hez. Alternatíva — DI (Hilt/Koin) NavGraph scope-pal.

Miért hozza létre újra a NavHost a composable-t minden átmenetkor?

Ez normális viselkedés — a NavHost eltávolítja a composable-t a kompozícióból az útvonal elhagyásakor. Az állapot megőrzéséhez használja a rememberSaveable függvényt az UI állapothoz és a ViewModel-t SavedStateHandle-pal az üzleti logikához.

Hogyan lehet 404-es (ismeretlen útvonal) kezelést hozzáadni a NavHost-hoz?

Adja hozzá az utolsó composable("404") útvonalat, és navigáljon rá ismeretlen deep link esetén. A NavHost-nak nincs catch-all útvonala — ellenőrizze az útvonalat a Deep Link intent-handlerben a navigate() előtt. Ha a route nem található — navigáljon a 404-re.

Összefoglalás

  • NavHost — a Navigation Compose composable konténere, amely összeköti a NavController-t az útvonalgráffal és megjeleníti az aktuális képernyőt
  • composable() regisztrálja az útvonalat route-tal, argumentumokkal (NavType), deep linkekkel és animációval
  • startDestination — a NavHost első indításakor megnyíló kezdeti útvonal
  • Argumentumok {param} helyőrzőkön keresztül kerülnek átadásra NavType-pal a tipizáláshoz és defaultValue-val az opcionális paraméterekhez
  • Beágyazott gráfok a navigation() segítségével lehetővé teszik az útvonalak modulonkénti csoportosítását elkülönített back stack-kel
  • Animáció az átmenetekhez enterTransition/exitTransition segítségével konfigurálható a Compose Animation API használatával
  • A NavHost automatikusan kezeli a back press-t, az állapotmentést és a deep linkeket további kód nélkül

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is