Navigator: διαχείριση οθονών στο Flutter

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

Navigator — είναι ένα widget-manager πλοήγησης στο Flutter που διαχειρίζεται τη στοίβα διαδρομών (Route) για την μετακίνηση μεταξύ οθονών μέσω των μεθόδων push, pop, pushReplacement και pushNamed. Σε αντίθεση με την άμεση αντικατάσταση widget μέσω State, το Navigator λειτουργεί σε επίπεδο ολόκληρων οθονών: αποθηκεύει το ιστορικό μεταβάσεων και υποστηρίζει animation πλατφόρμας. Σύμφωνα με Flutter API Reference (2026), το Navigator 2.0 (Router) παρέχει δηλωτική διαχείριση πλοήγησης για σύνθεκες σενάρια με βαθιά links και προσαρμοστικό σχέδιο. Σε μια τυπική εφαρμογή, το Navigator εξασφαλίζει τη σωστή συμπεριφορά του κουμπιού «Πίσω» στο Android και των χειρονομιών σύρσης στο iOS.

Βασικά σημεία

  • Navigator — διαχειριστής πλοήγησης, διαχειρίζεται τη στοίβα διαδρομών μέσω push, pop, pushNamed, pushReplacement και pushAndRemoveUntil
  • Στοίβα διαδρομών — το Navigator αποθηκεύει οθόνες σε στοίβα LIFO: κάθε push προσθέτει μια οθόνη στην κορυφή, το pop αφαιρεί την κορυφαία
  • pushNamed — πλοήγηση μέσω ονομασμένων διαδρομών που ορίζονται στο MaterialApp.routes ή onGenerateRoute
  • pushReplacement — αντικατάσταση της τρέχουσας οθόνης με μια νέα χωρίς δυνατότητα επιστροφής στην προηγούμενη (π.χ., μετά τη σύνδεση)
  • Navigator 2.0 — δηλωτικό API με Router, RouterDelegate και RouteInformationParser για πλοήγηση web και desktop

Τι είναι το Navigator στο Flutter

Navigator — είναι ένα widget που διαχειρίζεται τη στοίβα αντικειμένων Route και υλοποιεί την πλοήγηση οθόνης σε μια εφαρμογή Flutter. Κάθε κλήση push τοποθετεί ένα νέο Route στην κορυφή της στοίβας, το pop αφαιρεί το κορυφαίο Route και επιστρέφει στην προηγούμενη οθόνη. Το MaterialApp δημιουργεί αυτόματα ένα Navigator για ολόκληρη την εφαρμογή, καθιστώντας το προσβάσιμο μέσω Navigator.of(context).

Σε αντίθεση με το StatefulWidget, όπου η αντικατάσταση περιεχομένου γίνεται μέσω setState μέσα σε ένα widget, το Navigator λειτουργεί σε ολόκληρες οθόνες με δικό τους κύκλο ζωής. Κάθε Route στη στοίβα είναι μια απομονωμένη κατάσταση με δικό του BuildContext, που αποτρέπει τις διαρροές μνήμης και απλοποιεί τη διαχείριση εξαρτήσεων. Κατά την κλήση pop, το αχρηστοποίητο Route καταστρέφεται, απελευθερώνοντας πόρους.

Σύμφωνα με Flutter Navigation Guide (2026), το Navigator εξελίχθηκε από το imperative API (Navigator 1.0) στο δηλωτικό (Navigator 2.0). Το Navigator 1.0 χρησιμοποιεί απευθείας τις μεθόδους push/pop, που είναι βολικό για απλά σενάρια. Το Navigator 2.0 (Router) είναι κατάλληλο για εφαρμογές με βαθιά links, προσαρμοστική πλοήγηση και διαδρομολόγηση web.

Πώς λειτουργεί το Navigator εσωτερικά

Εσωτερικά, το Navigator χρησιμοποιεί Overlay — ένα ειδικό widget που εμφανίζει τα Route το ένα πάνω στο άλλο. Κάθε Route δημιουργεί τη δική του θέση στο Overlay με έναν δείκτη Z που αντιστοιχεί στο βάθος στη στοίβα. Αυτό εξηγεί γιατί στο push η νέα οθόνη εμφανίζεται με animation πάνω από την προηγούμενη, και στο pop — η προηγούμενη οθόνη είναι ήδη έτοιμη για εμφάνιση: δεν καταστράφηκε, απλώς παρέμεινε στο Overlay κάτω από το νέο.

Για τα animation μεταβάσεων, το Navigator χρησιμοποιεί το PageTransitionsTheme, που μπορεί να αντικατασταθεί στο ThemeData. Τα animation πλατφόρμας ορίζονται μέσω CupertinoPageRoute για iOS (σύρση από δεξιά) και MaterialPageRoute για Android (σύρση από κάτω). Το Navigator επιλέγει αυτόματα το σωστό animation όταν χρησιμοποιεί το PlatformRoute.

Navigator παρέχει ένα σύνολο μεθόδων για τη διαχείριση της στοίβας Route. Κάθε μέθοδος λύνει ένα συγκεκριμένο έργο πλοήγησης — από μια απλή μετάβαση μέχρι την πλήρη αντικατάσταση του ιστορικού οθόνης. Ας δούμε τις κύριες μεθόδους με παραδείγματα χρήσης.

ΜέθοδοςΠεριγραφήΣενάριο εφαρμογής
pushΠροσθήκη Route στην κορυφή της στοίβαςΜετάβαση σε νέα οθόνη με δυνατότητα επιστροφής
popΑφαίρεση κορυφαίου Route από τη στοίβαΕπιστροφή στην προηγούμενη οθόνη
pushReplacementΑντικαθιστά το τρέχον Route με νέοΜετά τη σύνδεση — η οθόνη σύνδεσης αντικαθίσταται από την κύρια
pushAndRemoveUntilΠροσθήκη Route και αφαίρεση προηγουμένων μέχρι συνθήκηςΈξοδος στην κύρια οθόνη με εκκαθάριση ιστορικού
popUntilΑφαίρεση Route από τη στοίβα μέχρι την επίτευξη συνθήκηςΕπιστροφή σε συγκεκριμένη οθόνη στο ιστορικό
maybePopΚαλεί pop μόνο αν η στοίβα περιέχει >1 RouteΠρόληψη κλεισίματος εφαρμογής σε τυχαίο πάτημα

Push και Pop: βασικές λειτουργίες

Η μέθοδος push δέχεται ένα Route και επιστρέφει ένα Future με το αποτέλεσμα που μεταβιβάζεται στο pop. Αυτό επιτρέπει τη λήψη δεδομένων από την οθόνη στην οποία πλοηγηθήκαμε. Παράδειγμα, μια οθόνη επιλογής ημερομηνίας μπορεί να επιστρέψει DateTime μέσω Navigator.pop(context, selectedDate). Η μέθοδος pop χωρίς όρισμα επιστρέφει null, με όρισμα — μεταβιβάζει την τιμή στην καλούσα οθόνη.

PushReplacement: αντικατάσταση οθόνης

pushReplacement αντικαθιστά το τρέχον Route με ένα νέο, αφαιρώντας το τρέχον από τη στοίβα. Αυτό είναι κρίσιμο σε σενάρια όπου ο χρήστης δεν πρέπει να επιστρέψει στην προηγούμενη οθόνη. Τυπικό παράδειγμα — οθόνη σύνδεσης: μετά την επιτυχή σύνδεση, η τρέχουσα οθόνη αντικαθίσταται από την κύρια, και το κουμπί «Πίσω» δεν επιστρέφει στη φόρμα σύνδεσης.

Ονομασμένες διαδρομές και onGenerateRoute

Navigator υποστηρίζει πλοήγηση μέσω ονομασμένων διαδρομών μέσω της μεθόδου pushNamed. Αντί να δημιουργήσει απευθείας ένα Route, ο προγραμματιστής καθορίζει ένα κειμενικό αναγνωριστικό, και το Navigator δημιουργεί αυτόματα ένα Route βάσει της διαμόρφωσης στο MaterialApp. Αυτό απλοποιεί τον κώδικα και κεντροποιεί τον ορισμό διαδρομών σε ένα σημείο.

Οι ονομασμένες διαδρομές ορίζονται μέσω της ιδιότητας routes στο MaterialApp, όπου κάθε κλειδί είναι ένα string διαδρομής και η τιμή είναι μια συνάρτηση που επιστρέφει ένα Widget. Για δυναμικές διαδρομές (με παραμέτρους), χρησιμοποιείται το onGenerateRoute — ένα callback που λαμβάνει RouteSettings και επιστρέφει ένα Route. Αυτό επιτρέπει τη μεταβίβαση ορισμάτων μέσω arguments και την υλοποίηση βαθιάς πλοήγησης.

Σύμφωνα με Flutter Cookbook (2026), η μεταβίβαση ορισμάτων μέσω pushNamed γίνεται με την παράμετρο arguments: Object?. Η οθόνη λήψης εξάγει τα ορίσματα μέσω ModalRoute.of(context)!.settings.arguments, που εξασφαλίζει ασφαλή μεταφορά δεδομένων χωρίς συνολικές μεταβλητές ή InheritedWidget.

Χειρισμός άγνωστων διαδρομών

Η ιδιότητα onUnknownRoute στο MaterialApp διαχειρίζεται περιπτώσεις όπου το pushNamed καλείται με μια ανύπαρκτη διαδρομή. Αυτό είναι χρήσιμο για την εμφάνιση οθόνης 404 ή ανακατεύθυνση στην κύρια σελίδα. Σε συνδυασμό με το onGenerateRoute, εξασφαλίζει πλήρη κάλυψη όλων των δυνατών σεναρίων πλοήγησης.

Navigator 2.0 (γνωστό και ως Router API) — είναι μια δηλωτική προσέγγιση στην πλοήγηση, που εισήχθη στο Flutter 2.0. Σε αντίθεση με το imperative Navigator 1.0, όπου ο προγραμματιστής καλεί push/pop, το Router διαχειρίζεται την πλοήγηση μέσω κατάστασης, συγχρονίζοντας αυτόματα το URL του προγράμματος πλοήγησης με την τρέχουσα οθόνη. Αυτό είναι ιδιαίτερα σημαντικό για εφαρμογές web και εκδόσεις desktop.

Η αρχιτεκτονική του Navigator 2.0 αποτελείται από τρία βασικά συστατικά: το RouteInformationParser αναλύει το URL σε διαμόρφωση διαδρομής, το RouterDelegate μετατρέπει τη διαμόρφωση σε λίστα Route, και το BackButtonDispatcher διαχειρίζεται το κουμπί συστήματος «Πίσω». Τέτοια αρχιτεκτονική καθιστά την πλοήγηση πλήρως προβλεπτή και δοκιμάσιμη.

Για την απλοποίηση της εργασίας με το Navigator 2.0, υπάρχουν πακέτα wrapper: go_router (συνιστάται από τη Google), auto_route και beamer. Το go_router παρέχει ένα δηλωτικό DSL για τον ορισμό διαδρομών με υποστήριξη για εμφωλευμένη πλοήγηση, ανακατευθύνσεις και βαθιά links χωρίς χειροκίνητη υλοποίηση RouterDelegate. Σύμφωνα με pub.dev (2026), το go_router χρησιμοποιείται σε 35% των νέων έργων Flutter που προτιμούν τη δηλωτική προσέγγιση.

Ας δούμε ένα παράδειγμα Navigator με ονομασμένες διαδρομές και μεταφορά δεδομένων μεταξύ οθονών. Ο κώδικας δείχνει μια οθόνη λίστας προϊόντων, μετάβαση στην οθόνη λεπτομερειών και επιστροφή με αποτέλεσμα.

dart
// Ρύθμιση διαδρομής στο MaterialApp
MaterialApp(
  initialRoute: '/',
  onGenerateRoute: (RouteSettings settings) {
    if (settings.name == '/') {
      return MaterialPageRoute(
        builder: (context) => const ProductListPage(),
      );
    }
    if (settings.name == '/product') {
      final productId = settings.arguments as String;
      return MaterialPageRoute(
        builder: (context) => ProductDetailPage(productId: productId),
      );
    }
    return MaterialPageRoute(
      builder: (context) => const NotFoundPage(),
    );
  },
)

// Πλοήγηση με μεταφορά δεδομένων
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Λήψη δεδομένων στην οθόνη λήψης
final args = ModalRoute.of(context)!.settings.arguments as String;

// Αντικατάσταση οθόνης μετά τη σύνδεση
Navigator.pushReplacementNamed(context, '/home');

// Εκκαθάριση στοίβας μέχρι την κύρια οθόνη
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

Στο παράδειγμα, το Navigator.pushNamed μεταβιβάζει το αναγνωριστικό προϊόντος στην οθόνη λεπτομερειών. Κατά την επιστροφή μέσω Navigator.pop(context, updatedProduct), η καλούσα οθόνη λαμβάνει τα ενημερωμένα δεδομένα στη μεταβλητή result. Το pushReplacementNamed αντικαθιστά την τρέχουσα οθόνη μετά την εξουσιοδότηση, και το pushNamedAndRemoveUntil με συνθήκη (route) => false καθαρίζει τελείως τη στοίβα, αποτρέποντας την επιστροφή σε προηγούμενες οθόνες.

Συχνές Ερωτήσεις

Ποια είναι η διαφορά μεταξύ Navigator 1.0 και Navigator 2.0;

Navigator 1.0 — imperative API με μεθόδους push και pop, βολικό για απλές εφαρμογές κινητών. Navigator 2.0 — δηλωτικό API μέσω Router, RouterDelegate και RouteInformationParser, απαραίτητο για εφαρμογές web με διαδρομολόγηση URL, βαθιά links και προσαρμοστική πλοήγηση. Για πρακτικά έργα, συνιστάται το go_router ως απλοποιημένο wrapper πάνω στο Navigator 2.0.

Πώς μεταφέρω δεδομένα μεταξύ οθονών μέσω Navigator;

Τα δεδομένα μεταφέρονται μέσω του ορίσματος arguments στο pushNamed ή απευθείας μέσω του κατασκευαστή Route. Στην οθόνη λήψης, τα δεδομένα εξάγονται μέσω ModalRoute.of(context)!.settings.arguments. Για την επιστροφή δεδομένων, χρησιμοποιήστε Navigator.pop(context, result) — η καλούσα οθόνη θα λάβει το αποτέλεσμα ως τιμή Future που επιστρέφεται από το push.

Γιατί το κουμπί «Πίσω» δεν επιστρέφει στην προηγούμενη οθόνη;

Αυτό συμβαίνει εάν η τρέχουσα οθόνη ανοίχτηκε μέσω pushReplacement, που αφαιρεί το προηγούμενο Route από τη στοίβα. Σε αυτή την περίπτωση, δεν υπάρχει ιστορικό πλοήγησης και το κουμπί «Πίσω» κλείνει την εφαρμογή. Για να επιστρέψετε, χρησιμοποιήστε συνηθισμένο push, όχι pushReplacement. Ελέγξτε επίσης ότι η κλήση Navigator.pop επεξεργάζεται σωστά στην τρέχουσα οθόνη.

Πώς να αποτρέψω την επιστροφή στην προηγούμενη οθόνη;

Χρησιμοποιήστε pushReplacement για την αντικατάσταση της τρέχουσας οθόνης με μια νέα — η προηγούμενη οθόνη αφαιρείται από τη στοίβα και δεν μπορείτε να επιστρέψετε σε αυτή. Για πλήρη εκκαθάριση του ιστορικού, χρησιμοποιήστε pushAndRemoveUntil με συνθήκη (route) => false. Εναλλακτικά, μπορείτε να παρακάμψετε το WillPopScope (παρωχημένο) ή το PopScope για την υποκλοπή του κουμπιού συστήματος «Πίσω».

Τι είναι το go_router και πότε να το χρησιμοποιώ;

go_router — είναι ένα δηλωτικό πακέτο πλοήγησης από τη Google, κατασκευασμένο πάνω στο Navigator 2.0. Παρέχει ένα απλό DSL για τον ορισμό διαδρομών με υποστήριξη για εμφωλευμένη πλοήγηση, ανακατευθύνσεις, βαθιά links και ShellRoute για BottomNavigationBar. Χρησιμοποιήστε το go_router σε νέα έργα, ιδιαίτερα εάν απαιτείται υποστήριξη web ή σύνθεκες πλοήγησης με προστατευμένες διαδρομές.

Περίληψη

  • Navigator — διαχειριστής πλοήγησης Flutter, διαχειρίζεται τη στοίβα Route με μεθόδους push, pop, pushReplacement και pushAndRemoveUntil
  • Στοίβα LIFO — κάθε push προσθέτει ένα Route στην κορυφή, το pop αφαιρεί το κορυφαίο; η στοίβα αποθηκεύει το ιστορικό μεταβάσεων με την αρχή «τελευταίο εισαγωγής, πρώτο εξαγωγής»
  • pushReplacement — αντικατάσταση της τρέχουσας οθόνης χωρίς δυνατότητα επιστροφής, κρίσιμο για σενάρια σύνδεσης και εισαγωγής
  • Ονομασμένες διαδρομές — pushNamed με RouteSettings και onGenerateRoute για κεντροποιημένο ορισμό διαδρομών με μεταβίβαση ορισμάτων
  • Navigator 2.0 — δηλωτική πλοήγηση μέσω Router, RouterDelegate και RouteInformationParser για βαθιά links web
  • go_router — συνιστώμενο από τη Google wrapper πάνω στο Navigator 2.0 με απλό DSL και υποστήριξη ShellRoute
  • Μεταφορά δεδομένων — μέσω arguments στο pushNamed και επιστροφή αποτελέσματος μέσω Future από το push με Navigator.pop(context, value)

Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση

Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.

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

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