Route — τι είναι, τύποι και δημιουργία διαδρομών στο Flutter

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

Route — είναι μια αφηρημένη κλάση στο Flutter που αντιπροσωπεύει μια ξεχωριστή οθόνη ή σελίδα στο ιστορικό πλοήγησης του Navigator. Οι συγκεκριμένες υλοποιήσεις του Route — MaterialPageRoute, CupertinoPageRoute και PlatformRoute — καθορίζουν πώς εμφανίζεται η οθόνη και ποια κινούμενη εικόνα χρησιμοποιείται κατά τη μετάβαση. Σε αντίθεση με ένα συνηθισμένο widget, το Route έχει τον δικό του κύκλο ζωής με μεθόδους didPush, didPop, didReplace και didChangeNext. Σύμφωνα με το Flutter API Reference (2026), κάθε Route διαχειρίζεται το ModalBarrier, λαμβάνει υπόψη τα χαρακτηριστικά της πλατφόρμας (σάρωση πίσω στο iOS) και εξασφαλίζει απομόνωση κατάστασης μεταξύ των οθονών.

Κύρια σημεία

  • Route — αφηρημένη κλάση οθόνης στο Flutter με δικό της κύκλο ζωής (didPush, didPop, didReplace, didChangeNext)
  • MaterialPageRoute — τυπική υλοποίηση Route με κινούμενη εικόνα Material (σύρσιμο από κάτω) για Android και desktop
  • CupertinoPageRoute — υλοποίηση Route με κινούμενη εικόνα iOS (σύρσιμο από δεξιά + χειρονομία σάρωσης πίσω) για iPhone και iPad
  • Κύκλος ζωής — το Route περνά από στάδια: μετάβαση (Transition), εμφάνιση (Active), απόκρυψη (Inactive) και καταστροφή (Disposed)
  • Μεταφορά δεδομένων — το Route δέχεται ορίσματα μέσω του κατασκευαστή και επιστρέφει αποτέλεσμα μέσω Future κατά την ολοκλήρωση

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

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

Σε αντίθεση με την απλή αντικατάσταση widget, το Route παρέχει υπηρεσίες που δεν είναι διαθέσιμες στα συνηθισμένα widget: ModalBarrier (σκοτείνιασμα του φόντου όταν είναι ανοιχτό ένα παράθυρο διαλόγου), διαχείριση κινούμενης εικόνας εισόδου και εξόδου, επεξεργασία του κουμπιού “Πίσω” υλικού στο Android και ενσωμάτωση με κινούμενη εικόνα Hero για ομαλές μεταβάσεις μεταξύ οθονών.

Σύμφωνα με το Flutter Cookbook (2026), το Route είναι ένα βασικό στοιχείο για την κινούμενη εικόνα Hero: το widget Hero σε ένα Route κινεί αυτόματα τη μετάβαση στο widget Hero στο επόμενο Route, δημιουργώντας το εφέ ενός “πετώντας” στοιχείου. Αυτό είναι δυνατό ακριβώς επειδή το Route διατηρεί και τις δύο οθόνες στο Overlay κατά τη διάρκεια της κινούμενης εικόνας.

Το Route ως δομικό στοιχείο πλοήγησης

Route είναι η βάση τόσο για απλές εφαρμογές κινητών (μέσω Navigator 1.0), όσο και για πολύπλοκα σενάρια με βαθείς συνδέσμους (Navigator 2.0). Στο Navigator 2.0, το Route αντιπροσωπεύει ένα Page που το RouterDelegate μετατρέπει από τη διαμόρφωση διαδρομής. Επομένως, η κατανόηση του Route είναι απαραίτητη για εργασία με οποιοδήποτε σύστημα πλοήγησης Flutter — ανεξάρτητα από την επιλεγμένη προσέγγιση ή πακέτο.

Τύποι Route: MaterialPageRoute και CupertinoPageRoute

Flutter παρέχει πολλές ενσωματωμένες υλοποιήσεις του Route, καθεμία προσαρμόζοντας τη συμπεριφορά για μια συγκεκριμένη πλατφόρμα. Η επιλογή του σωστού τύπου Route επηρεάζει την εμπειρία χρήστη: η κινούμενη εικόνα Material στο Android και η κινούμενη εικόνα Cupertino στο iOS δημιουργούν την αίσθηση μιας “εγγενούς” εφαρμογής.

Τύπος RouteΚινούμενη εικόναΠλατφόρμαΧαρακτηριστικά
MaterialPageRouteΣύρσιμο από κάτω προς τα πάνωAndroid, desktopσκιά κατά τη μετάβαση, αυτόματη επεξεργασία SafeArea
CupertinoPageRouteΣύρσιμο από δεξιά προς τα αριστεράiOS, iPadOSχειρονομία σάρωσης πίσω, διάφανο φόντο κατά τη μετάβαση
PlatformRouteΑυτόματη επιλογήΌλες οι πλατφόρμεςεπιλέγει τύπο βάσει TargetPlatform
PageRouteBuilderΠροσαρμοσμένηΌλες οι πλατφόρμεςπλήρης έλεγχος κινούμενης εικόνας μέσω AnimationController

MaterialPageRoute: πρότυπο για Android

MaterialPageRoute — η πιο συχνά χρησιμοποιούμενη υλοποίηση Route. Κινεί την είσοδο μιας νέας οθόνης από κάτω προς τα πάνω με σταδιακή εμφάνιση. Κατά την έξοδο, η οθόνη κινείται από πάνω προς τα κάτω, επιστρέφοντας στην αρχική θέση. Η γραμμή εργαλείων (AppBar) και το σώμα της οθόνης κινούνται ξεχωριστά, δημιουργώντας ένα εφέ ιεραρχίας.

CupertinoPageRoute: στυλ πλοήγησης iOS

CupertinoPageRoute μιμείται το UINavigationController από το iOS. Η νέα οθόνη εισέρχεται από τα δεξιά, καλύπτοντας την προηγούμενη. Το βασικό χαρακτηριστικό — υποστήριξη για διαδραστική χειρονομία σάρωσης πίσω, υλοποιημένη μέσω CupertinoBackGestureDetector. Αυτή η χειρονομία επεξεργάζεται ακόμη και στη μέση της κινούμενης εικόνας, παρέχοντας φυσική συμπεριφορά γνώριμη στους χρήστες iPhone.

Κύκλος ζωής του Route: από τη δημιουργία στην καταστροφή

Route έχει τον δικό του κύκλο ζωής που διαφέρει από τον κύκλο ζωής ενός συνηθισμένου StatefulWidget. Η κατανόηση αυτού του κύκλου είναι απαραίτητη για τη σωστή αρχικοποίηση δεδομένων, εγγραφή σε ροές και απελευθέρωση πόρων κατά το κλείσιμο της οθόνης.

Στάδια του κύκλου ζωής του Route

Ο κύκλος ζωής του Route αποτελείται από τέσσερα κύρια στάδια. Transition — το Route δημιουργείται και κινείται κατά την είσοδο (καλείται didPush). Active — το Route εμφανίζεται πλήρως και αλληλεπιδρά με τον χρήστη. Inactive — ένα άλλο Route καλύπτει το τρέχον (παράθυρο διαλόγου, κάτω οθόνη), αλλά το Route παραμένει στη στοίβα. Disposed — το Route αφαιρείται από τη στοίβα και καταστρέφεται, καλούνται didPop και dispose.

Οι μέθοδοι κύκλου ζωής του Route μπορούν να παρακαμφθούν σε μια προσαρμοσμένη υλοποίηση. Για παράδειγμα, το didPop καλείται όταν το Route αφαιρείται από τη στοίβα — εδώ μπορεί να αποθηκευτεί ένα πρόχειρο δεδομένων. Το didChangeNext καλείται όταν το επόμενο Route στη στοίβα έχει αλλάξει — χρήσιμο για ενημέρωση του UI όταν αλλάζει το ιστορικό πλοήγησης.

Σύμφωνα με το Flutter API Route.didPop (2026), είναι σημαντικό να μην συγχέεται ο κύκλος ζωής του Route με τον κύκλο ζωής του State μέσα στο Route. Το StatefulWidget μέσα στο Route έχει τους δικούς του initState και dispose που καλούνται στα στάδια Transition και Disposed αντίστοιχα. Το Route ζει περισσότερο από το εσωτερικό του State — το Route παραμένει στο Overlay ακόμη και όταν τα widget του κρύβονται προσωρινά από ένα άλλο Route.

Μεταφορά δεδομένων μέσω Route μεταξύ οθονών

Route παρέχει μηχανισμούς για μεταφορά δεδομένων τόσο κατά την είσοδο (κατά τη δημιουργία) όσο και κατά την έξοδο (κατά την ολοκλήρωση). Η σωστή μεταφορά δεδομένων μέσω Route εξαλείφει την ανάγκη για καθολικές μεταβλητές και InheritedWidget, κάνοντας την πλοήγηση ασφαλή τύπου και προβλέψιμη.

Για τη μεταφορά δεδομένων σε μια νέα οθόνη χρησιμοποιείται ο κατασκευαστής του widget παραλήπτη ή το όρισμα arguments στο Navigator.pushNamed. Μέσα στο Route, τα δεδομένα είναι προσβάσιμα μέσω RouteSettings.arguments που αποθηκεύεται στο αντικείμενο Route. Αυτή η προσέγγιση λειτουργεί για όλους τους τύπους Route — MaterialPageRoute, CupertinoPageRoute και προσαρμοσμένες υλοποιήσεις.

Για την επιστροφή δεδομένων χρησιμοποιείται το δεύτερο όρισμα Navigator.pop(context, result). Το Navigator.push επιστρέφει ένα Future που ολοκληρώνεται με την τιμή που μεταβιβάστηκε στο pop. Εάν το pop κληθεί χωρίς όρισμα, το Future ολοκληρώνεται με null. Αυτός ο μηχανισμός είναι ανάλογος του startActivityForResult στο Android και του completion handler στο iOS, αλλά υλοποιημένος μέσω Dart Futures.

Παράδειγμα μεταφοράς δεδομένων μέσω του κατασκευαστή Route

Κατά την άμεση κλήση Navigator.push με MaterialPageRoute, τα δεδομένα μεταφέρονται μέσω του κατασκευαστή της οθόνης προορισμού. Το MethodChannel δεν χρησιμοποιείται — είναι καθαρή αλληλεπίδραση Dart. Αυτή η προσέγγιση προτιμάται για ασφαλή τύπου μεταφορά πολύπλοκων αντικειμένων.

Παράδειγμα δημιουργίας προσαρμοσμένου Route

Ας εξετάσουμε ένα παράδειγμα δημιουργίας ενός προσαρμοσμένου Route με δική του κινούμενη εικόνα και μεταφορά δεδομένων. Το PageRouteBuilder επιτρέπει τον ορισμό κινούμενης εικόνας εισόδου και εξόδου με πλήρη έλεγχο της καμπύλης κινούμενης εικόνας και διάρκειας.

dart
// Προσαρμοσμένο Route με κινούμενη εικόνα σύρσιμου
Navigator.push(context, PageRouteBuilder(
  pageBuilder: (context, animation, secondaryAnimation) {
    return DetailPage(productId: '42');
  },
  transitionsBuilder: (context, animation, secondaryAnimation, child) {
    const begin = Offset(0.0, 0.3);
    const end = Offset.zero;
    final tween = Tween(begin: begin, end: end);
    final offsetAnimation = animation.drive(tween);
    return SlideTransition(position: offsetAnimation, child: child);
  },
  transitionDuration: const Duration(milliseconds: 400),
));

// Επιστροφή δεδομένων από οθόνη
ElevatedButton(
  onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
  child: const Text('Επιλογή'),
);

// Λήψη αποτελέσματος στην καλούσα οθόνη
final result = await Navigator.push(context, MaterialPageRoute(
  builder: (context) => const SelectionPage(),
));
if (result != null) {
  print('Επιλεγμένο: ${result['selected']}');
}

Στο παράδειγμα, το PageRouteBuilder ορίζει μια προσαρμοσμένη κινούμενη εικόνα σύρσιμου από κάτω με διαφάνεια. Το transitionDuration καθορίζει την ταχύτητα της κινούμενης εικόνας. Ο κώδικας δείχνει επίσης τη μεταφορά αποτελέσματος: η οθόνη λεπτομερειών επιστρέφει ένα Map με την επιλογή του χρήστη, και η καλούσα οθόνη λαμβάνει αυτά τα δεδομένα μέσω Future από το push. Το Route εξασφαλίζει πλήρη απομόνωση: τα πρόχειρα στην οθόνη λεπτομερειών δεν επηρεάζουν την κατάσταση της λίστας.

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

Ποια είναι η διαφορά μεταξύ Route και Widget στο Flutter;

Route — είναι ένα αντικείμενο που διαχειρίζεται την οθόνη σε επίπεδο πλοήγησης: αποθηκεύει κινούμενη εικόνα, ModalBarrier και κύκλο ζωής. Widget — είναι μια περιγραφή ενός μέρους της διεπαφής. Το Route περιέχει ένα Widget μέσα του, αλλά παρέχει επίσης υπηρεσίες (επίπεδο Overlay, κινούμενη εικόνα Hero) που δεν είναι διαθέσιμες στα συνηθισμένα widget. Ένα μόνο Route μπορεί να περιέχει μια πολύπλοκη ιεραρχία widget οποιουδήποτε βάθους.

Πώς να δημιουργήσετε ένα Route με προσαρμοσμένη κινούμενη εικόνα;

Χρησιμοποιήστε το PageRouteBuilder με παραμέτρους pageBuilder (κατασκευή οθόνης) και transitionsBuilder (ορισμός κινούμενης εικόνας). Στο transitionsBuilder είναι διαθέσιμα animation (0.0–1.0) και secondaryAnimation για παράλληλες κινούμενες εικόνες. Για πλήρη έλεγχο, δημιουργήστε μια υποκλάση του Route και παρακάμψτε τα buildPage, createAnimationController και buildTransitions, που θα δώσει πρόσβαση σε χαμηλού επιπέδου AnimationController.

Πώς να μεταφέρετε ένα πολύπλοκο αντικείμενο μεταξύ Route;

Για τη μεταφορά πολύπλοκων αντικειμένων, χρησιμοποιήστε τον κατασκευαστή της οθόνης προορισμού στο άμεσο Navigator.push ή το όρισμα arguments στο pushNamed. Βεβαιωθείτε ότι το αντικείμενο είναι σειριοποιήσιμο (Map, JSON ή προσαρμοσμένη κλάση). Για ασφαλή τύπου μεταφορά στο Flutter χρησιμοποιούνται μοντέλα freezed ή json_serializable που εγγυώνται σωστή αποσειριοποίηση κατά τη μεταφορά μέσω RouteSettings.

Γιατί το Route μπορεί να μην καλέσει dispose;

Route.dispose δεν καλείται εάν το Route παραμείνει στη στοίβα Navigator. Για παράδειγμα, κατά το άνοιγμα ενός νέου Route, το παλιό Route περνά σε ανενεργή κατάσταση (Inactive), αλλά δεν καταστρέφεται — παραμένει στη στοίβα για γρήγορη επιστροφή. Το Dispose καλείται μόνο όταν το Route αφαιρείται από τη στοίβα μέσω pop, pushReplacement ή pushAndRemoveUntil. Για απελευθέρωση πόρων, χρησιμοποιήστε το dispose του State μέσα στο Route, όχι το dispose του ίδιου του Route.

Πώς να ελέγξετε ποιο Route είναι τώρα ενεργό;

Χρησιμοποιήστε το ModalRoute.of(context) για να λάβετε το τρέχον Route από το BuildContext. Η ιδιότητα ModalRoute.isActive δείχνει εάν το Route είναι η τρέχουσα ορατή οθόνη. ModalRoute.isCurrent — true εάν το Route βρίσκεται στην κορυφή της στοίβας. Για παρακολούθηση αλλαγών στη στοίβα, εγγραφείτε στους παρατηρητές Navigator μέσω RouteAware και RouteObserver, οι οποίοι ειδοποιούν για αλλαγή του ενεργού Route.

Περίληψη

  • Route — αφηρημένη κλάση οθόνης στο Flutter με κύκλο ζωής (didPush, didPop, didReplace, didChangeNext) και υποστήριξη ModalBarrier και κινούμενης εικόνας Hero
  • MaterialPageRoute — υλοποίηση για Android με κινούμενη εικόνα σύρσιμου από κάτω, σκιά και αυτόματο SafeArea
  • CupertinoPageRoute — υλοποίηση για iOS με κινούμενη εικόνα σύρσιμου από δεξιά και διαδραστική χειρονομία σάρωσης πίσω
  • PageRouteBuilder — εργαλείο για δημιουργία Route με προσαρμοσμένη κινούμενη εικόνα μέσω transitionsBuilder και AnimationController
  • Μεταφορά δεδομένων — μέσω κατασκευαστή Route (push) ή arguments (pushNamed) κατά την είσοδο, μέσω Navigator.pop(context, result) κατά την έξοδο με Future
  • Κύκλος ζωής — τέσσερα στάδια: Transition (didPush), Active, Inactive (καλυμμένο από άλλο Route), Disposed (didPop + dispose)
  • Απομόνωση οθονών — κάθε Route έχει δικό του BuildContext και κατάσταση, αποτρέποντας διαρροές και απλοποιώντας τη διαχείριση δεδομένων

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

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

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

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