Route ist eine abstrakte Klasse in Flutter, die einen einzelnen Bildschirm oder eine Seite im Navigationsverlauf des Navigators darstellt. Die konkreten Implementierungen von Route — MaterialPageRoute, CupertinoPageRoute und PlatformRoute — bestimmen, wie der Bildschirm angezeigt wird und welche Animation beim Übergang verwendet wird. Im Gegensatz zu einem normalen Widget hat Route einen eigenen Lebenszyklus mit den Methoden didPush, didPop, didReplace und didChangeNext. Laut Flutter API Reference (2026) verwaltet jede Route ModalBarrier, berücksichtigt plattformspezifische Funktionen (Wisch-zurück auf iOS) und gewährleistet die Zustandsisolation zwischen Bildschirmen.
Wichtige Punkte
Route ist die Grundlage des Flutter-Navigationssystems. Jeder Bildschirm, den der Benutzer in einer Anwendung sieht, wird durch ein Route-Objekt dargestellt, das sich im Navigator-Stack befindet. Route abstrahiert den Bildschirm vom Steuercode: Navigator fügt Route hinzu und entfernt sie, während sich innerhalb der Route die Schnittstelle befindet, die der Benutzer sieht. Diese Architektur trennt die Verantwortung zwischen Navigation und Anzeige.
Im Gegensatz zum einfachen Austausch von Widgets bietet Route Dienste, die normalen Widgets nicht zur Verfügung stehen: ModalBarrier (Abdunkeln des Hintergrunds bei geöffnetem Dialog), Steuerung der Ein- und Ausgangsanimation, Behandlung der Hardware-Zurück-Taste auf Android und Integration mit Hero-Animation für sanfte Übergänge zwischen Bildschirmen.
Laut Flutter Cookbook (2026) ist Route ein Schlüsselelement für die Hero-Animation: Ein Hero-Widget auf einer Route animiert automatisch den Übergang zu einem Hero-Widget auf der nächsten Route und erzeugt einen „fliegenden“ Elementeffekt. Dies ist möglich, weil Route während der Animation beide Bildschirme im Overlay behält.
Route ist die Grundlage sowohl für einfache mobile Anwendungen (über Navigator 1.0) als auch für komplexe Szenarien mit Deep Links (Navigator 2.0). In Navigator 2.0 repräsentiert Route eine Page, die RouterDelegate aus der Routenkonfiguration konvertiert. Daher ist das Verständnis von Route für die Arbeit mit jedem Flutter-Navigationssystem unerlässlich — unabhängig vom gewählten Ansatz oder Paket.
Flutter bietet mehrere integrierte Route-Implementierungen, die jeweils das Verhalten an eine bestimmte Plattform anpassen. Die Wahl des richtigen Route-Typs beeinflusst die Benutzererfahrung: Material-Animation auf Android und Cupertino-Animation auf iOS erzeugen das Gefühl einer „nativen“ Anwendung.
| Route-Typ | Animation | Plattform | Eigenschaften |
|---|---|---|---|
| MaterialPageRoute | Von unten nach oben schieben | Android, Desktop | Schatten beim Übergang, automatische SafeArea-Behandlung |
| CupertinoPageRoute | Von rechts nach links schieben | iOS, iPadOS | Geste Wisch-zurück, transparenter Hintergrund während des Übergangs |
| PlatformRoute | Automatische Auswahl | Alle Plattformen | Wählt Typ basierend auf TargetPlatform aus |
| PageRouteBuilder | Benutzerdefiniert | Alle Plattformen | Vollständige Kontrolle über Animation via AnimationController |
MaterialPageRoute ist die am häufigsten verwendete Route-Implementierung. Sie animiert den neuen Bildschirm von unten nach oben mit allmählichem Erscheinen. Beim Verlassen animiert der Bildschirm von oben nach unten und kehrt in seine ursprüngliche Position zurück. Die Symbolleiste (AppBar) und der Bildschirmkörper werden getrennt animiert, was einen Hierarchieeffekt erzeugt.
CupertinoPageRoute imitiert UINavigationController von iOS. Der neue Bildschirm kommt von rechts herein und bedeckt den vorherigen. Das Hauptmerkmal ist die Unterstützung der interaktiven Wisch-zurück-Geste, implementiert über CupertinoBackGestureDetector. Diese Geste wird sogar während der Animation behandelt und bietet ein natürliches Verhalten, das iPhone-Benutzern vertraut ist.
Route hat einen eigenen Lebenszyklus, der sich vom Lebenszyklus eines normalen StatefulWidget unterscheidet. Das Verständnis dieses Zyklus ist für die korrekte Dateninitialisierung, Stream-Abonnements und die Ressourcenfreigabe beim Schließen eines Bildschirms erforderlich.
Der Route-Lebenszyklus besteht aus vier Hauptphasen. Übergang — Route wird erstellt und beim Eintritt animiert (didPush wird aufgerufen). Aktiv — Route wird vollständig angezeigt und interagiert mit dem Benutzer. Inaktiv — eine andere Route bedeckt die aktuelle (Dialog, unteres Blatt), aber die Route bleibt im Stack. Verworfen — Route wird aus dem Stack entfernt und zerstört, didPop und dispose werden aufgerufen.
Die Lebenszyklusmethoden von Route können in einer benutzerdefinierten Implementierung überschrieben werden. Beispielsweise wird didPop aufgerufen, wenn Route aus dem Stack entfernt wird — hier können Sie Entwurfsdaten speichern. didChangeNext wird aufgerufen, wenn sich die nächste Route im Stack geändert hat — nützlich zum Aktualisieren der UI bei Änderungen des Navigationsverlaufs.
Laut Flutter API Route.didPop (2026) ist es wichtig, den Lebenszyklus von Route nicht mit dem Lebenszyklus von State innerhalb von Route zu verwechseln. StatefulWidget innerhalb von Route hat seinen eigenen initState und dispose, die während der Übergangs- bzw. Verworfen-Phase aufgerufen werden. Route lebt länger als ihr interner State — Route bleibt im Overlay, auch wenn ihre Widgets vorübergehend von einer anderen Route versteckt werden.
Route bietet Mechanismen zur Datenübergabe sowohl bei der Eingabe (bei der Erstellung) als auch bei der Ausgabe (bei Abschluss). Die korrekte Datenübergabe via Route macht globale Variablen und InheritedWidget überflüssig und macht die Navigation typsicher und vorhersagbar.
Um Daten an einen neuen Bildschirm zu übergeben, verwenden Sie den Konstruktor des empfangenden Widgets oder den arguments-Parameter in Navigator.pushNamed. Innerhalb von Route sind die Daten über RouteSettings.arguments zugänglich, die im Route-Objekt gespeichert sind. Dieser Ansatz funktioniert für alle Route-Typen — MaterialPageRoute, CupertinoPageRoute und benutzerdefinierte Implementierungen.
Um Daten zurückzugeben, verwenden Sie das zweite Argument von Navigator.pop(context, result). Navigator.push gibt Future
Beim direkten Aufruf von Navigator.push mit MaterialPageRoute werden die Daten über den Konstruktor des Zielbildschirms übergeben. MethodChannel wird nicht verwendet — dies ist eine reine Dart-Interaktion. Dieser Ansatz wird für die typsichere Übergabe komplexer Objekte bevorzugt.
Betrachten wir ein Beispiel für die Erstellung einer benutzerdefinierten Route mit eigener Animation und Datenübergabe. PageRouteBuilder ermöglicht die Definition von Ein- und Ausgangsanimationen mit vollständiger Kontrolle über die Animationskurve und -dauer.
// Benutzerdefinierte Route mit Slide-Animation
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),
));
// Daten vom Bildschirm zurückgeben
ElevatedButton(
onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
child: const Text('Auswählen'),
);
// Ergebnis auf dem aufrufenden Bildschirm abrufen
final result = await Navigator.push(context, MaterialPageRoute(
builder: (context) => const SelectionPage(),
));
if (result != null) {
print('Ausgewählt: ${result['selected']}');
}
Im Beispiel definiert PageRouteBuilder eine benutzerdefinierte Slide-von-unten-Animation mit Transparenz. transitionDuration legt die Geschwindigkeit der Animation fest. Der Code demonstriert auch die Ergebnisübergabe: Der Detailbildschirm gibt eine Map mit der Auswahl des Benutzers zurück, und der aufrufende Bildschirm erhält diese Daten über das Future von push. Route gewährleistet vollständige Isolation: Entwürfe auf dem Detailbildschirm beeinflussen den Listenstatus nicht.
Häufig gestellte Fragen
Route ist ein Objekt, das einen Bildschirm auf Navigationsebene verwaltet: Es speichert Animation, ModalBarrier und Lebenszyklus. Widget ist eine Beschreibung eines Teils der Benutzeroberfläche. Route enthält Widget in sich, bietet aber auch Dienste (Overlay-Ebene, Hero-Animation), die normalen Widgets nicht zur Verfügung stehen. Eine Route kann eine komplexe Hierarchie von Widgets beliebiger Tiefe enthalten.
Verwenden Sie PageRouteBuilder mit den Parametern pageBuilder (Bildschirmaufbau) und transitionsBuilder (Animationsdefinition). In transitionsBuilder stehen animation (0.0–1.0) und secondaryAnimation für parallele Animationen zur Verfügung. Für vollständige Kontrolle erstellen Sie eine Unterklasse von Route und überschreiben buildPage, createAnimationController und buildTransitions, was Zugriff auf low-level AnimationController bietet.
Um komplexe Objekte zu übergeben, verwenden Sie den Konstruktor des Zielbildschirms beim direkten Aufruf von Navigator.push oder den arguments-Parameter bei pushNamed. Stellen Sie sicher, dass das Objekt serialisierbar ist (Map, JSON oder benutzerdefinierte Klasse). Für typsichere Übergabe in Flutter verwenden Sie freezed- oder json_serializable-Modelle, die eine korrekte Deserialisierung bei der Übergabe über RouteSettings gewährleisten.
Route.dispose wird nicht aufgerufen, wenn Route im Navigator-Stack verbleibt. Beispielsweise beim Öffnen einer neuen Route geht die alte Route in den inaktiven Zustand über, wird aber nicht zerstört — sie bleibt für die schnelle Rückkehr im Stack. Dispose wird nur aufgerufen, wenn Route aus dem Stack entfernt wird, via pop, pushReplacement oder pushAndRemoveUntil. Verwenden Sie zum Freigeben von Ressourcen das dispose von State innerhalb von Route, nicht das dispose der Route selbst.
Verwenden Sie ModalRoute.of(context), um die aktuelle Route aus BuildContext zu erhalten. Die Eigenschaft ModalRoute.isActive zeigt an, ob die Route der aktuell sichtbare Bildschirm ist. ModalRoute.isCurrent — true, wenn die Route die Spitze des Stacks ist. Um Stack-Änderungen zu beobachten, abonnieren Sie Navigator-Beobachter über RouteAware und RouteObserver, die über Änderungen der aktiven Route benachrichtigen.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch