Navigation Compose: τι είναι, αρχιτεκτονική και λειτουργία στην ανάπτυξη

Συγγραφέας: IT Sectr Δημοσιεύτηκε: 2026-06-29 Χρόνος ανάγνωσης: 8 λεπ

Navigation Compose — είναι μια βιβλιοθήκη Jetpack για δηλωτική πλοήγηση σε εφαρμογές Android που βασίζονται στο Jetpack Compose. Αντί για FragmentManager ή πλοήγηση βασισμένη σε Intent, το 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, ορίσματα και κατάσταση. Αυτό απλοποιεί την αρχιτεκτονική και εξαλείφει τις συγκρούσεις κύκλου ζωής που χαρακτηρίζουν την πλοήγηση 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 είναι μια συμβολοσειρά διαδρομής με προαιρετικά placeholders {param}. Όταν η τρέχουσα διαδρομή ταιριάζει με το route, το NavHost αποδίδει το αντίστοιχο μπλοκ composable.

Ο γράφος διαδρομών κατασκευάζεται ιεραρχικά: οι γράφοι μπορούν να ενσωματωθούν μέσω navigation() για ομαδοποίηση διαδρομών εντός ενός module. Οι ένθετοι γράφοι έχουν δικό τους startDestination και ενώνονται υπό ένα κοινό πρόθεμα route. Αυτό επιτρέπει την οργάνωση αρθρωτής αρχιτεκτονικής, όπου κάθε feature-module καταχωρεί τον υπογράφο του.

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. Οι παράμετροι ορίζονται στη διαδρομή ως {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: οι διαδρομές ορίζονται ως κλάσεις δεδομένων, τα ορίσματα ως πεδία. Αυτό αντικαθιστά τις συμβολοσειρές 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), επαλήθευση email, κοινοποίηση περιεχομένου και πλοήγηση από 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 είναι απλούστερη, ταχύτερη και δεν έχει κύκλους ζωής Fragment. Το Navigation Component για View είναι κατάλληλο μόνο για υβριδικές εφαρμογές.

Πώς να μεταφέρετε ένα σύνθετο αντικείμενο μεταξύ οθονών;

Συνιστάται η μεταφορά ID του αντικειμένου και φόρτωση δεδομένων μέσω ViewModel με SavedStateHandle. Εάν το αντικείμενο είναι απλό — χρησιμοποιήστε Parcelable μέσω kotlinx.parcelize. Η άμεση μεταφορά μεγάλων αντικειμένων μέσω ορισμάτων (Bundle) περιορίζεται σε ~1 MB και μπορεί να προκαλέσει TransactionTooLargeException.

Υποστηρίζει το Navigation Compose ένθετους γράφους;

Ναι, μέσω της συνάρτησης navigation(route, startDestination) εντός του NavHost. Οι ένθετοι γράφοι έχουν δικό τους startDestination και ενώνονται υπό ένα κοινό πρόθεμα route. Αυτό επιτρέπει την οργάνωση αρθρωτής αρχιτεκτονικής με απομονωμένους γράφους για κάθε feature-module.

Πώς να χειριστείτε το κουμπί Πίσω του συστήματος στο Navigation Compose;

Το NavController χειρίζεται αυτόματα το back press μέσω BackHandler από το Compose. Καλέστε το navController.popBackStack() όταν πατηθεί το κουμπί Πίσω. Για προσαρμοσμένο χειρισμό (επιβεβαίωση εξόδου), χρησιμοποιήστε BackHandler(enabled = condition) { callback } πριν από την κλήση popBackStack().

Μπορεί το Navigation Compose να χρησιμοποιηθεί με Jetpack Compose Multiplatform;

Προς το παρόν, το Navigation Compose δεν υποστηρίζεται στο Compose Multiplatform. Για το τμήμα iOS διασταυρούμενων πλατφορμών, χρησιμοποιήστε Voyager ή Decompose. Η Google εργάζεται σε υποστήριξη KMP, αλλά δεν υπάρχουν ημερομηνίες κυκλοφορίας. Για έργα μόνο Android, το 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. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

Συζήτηση έργου

Διαβάστε επίσης