Route — is een abstracte klasse in Flutter die een afzonderlijk scherm of pagina vertegenwoordigt in de navigatiegeschiedenis van Navigator. Concrete implementaties van Route — MaterialPageRoute, CupertinoPageRoute en PlatformRoute — bepalen hoe het scherm wordt weergegeven en welke animatie wordt gebruikt bij de overgang. In tegenstelling tot een gewone widget heeft Route zijn eigen levenscyclus met de methoden didPush, didPop, didReplace en didChangeNext. Volgens Flutter API Reference (2026) beheert elke Route ModalBarrier, houdt rekening met platformkenmerken (veeg terug op iOS) en zorgt voor isolatie van de toestand tussen schermen.
Belangrijkste punten
Route — is de basis van het navigatiesysteem van Flutter. Elk scherm dat de gebruiker in de app ziet, wordt vertegenwoordigd door een Route-object in de Navigator-stack. Route abstraheert het scherm van de beheercode: Navigator voegt Routes toe en verwijdert ze, en in de Route bevindt zich de interface die de gebruiker ziet. Deze architectuur scheidt de verantwoordelijkheid tussen navigatie en weergave.
In tegenstelling tot eenvoudige widgetvervanging biedt Route diensten die niet beschikbaar zijn voor gewone widgets: ModalBarrier (het dimmen van de achtergrond bij een geopend dialoogvenster), beheer van de in- en uitgangsanimatie, verwerking van de hardwarematige „Terug”-knop op Android en integratie met Hero-animatie voor vloeiende overgangen tussen schermen.
Volgens Flutter Cookbook (2026) is Route een sleutelelement voor Hero-animatie: de Hero-widget op de ene Route animeert automatisch de overgang naar de Hero-widget op de volgende Route, waardoor een „vliegend” elementeffect ontstaat. Dit is mogelijk juist omdat Route beide schermen in de Overlay houdt tijdens de animatie.
Route is de basis voor zowel eenvoudige mobiele apps (via Navigator 1.0) als complexe scenario's met diepe links (Navigator 2.0). In Navigator 2.0 vertegenwoordigt Route een Page die RouterDelegate converteert uit de routeconfiguratie. Het begrijpen van Route is dus noodzakelijk voor het werken met elk navigatiesysteem van Flutter — ongeacht de gekozen aanpak of het pakket.
Flutter biedt verschillende ingebouwde implementaties van Route, die elk het gedrag aanpassen aan een specifiek platform. De keuze van het juiste Route-type beïnvloedt de gebruikerservaring: Materiaal-animatie op Android en Cupertino-animatie op iOS creëren het gevoel van een „native” app.
| Route-type | Animatie | Platform | Kenmerken |
|---|---|---|---|
| MaterialPageRoute | Schuif van onder naar boven | Android, desktop | schaduw bij overgang, automatische SafeArea-verwerking |
| CupertinoPageRoute | Schuif van rechts naar links | iOS, iPadOS | veeg-terug gebaar, transparante achtergrond bij overgang |
| PlatformRoute | Automatische selectie | Alle platforms | selecteert type op basis van TargetPlatform |
| PageRouteBuilder | Aangepast | Alle platforms | volledige controle over animatie via AnimationController |
MaterialPageRoute — de meest gebruikte implementatie van Route. Het animeert de binnenkomst van een nieuw scherm van onder naar boven met geleidelijke verschijning. Bij uitgang animeert het scherm van boven naar onder, terugkerend naar de beginpositie. De werkbalk (AppBar) en de inhoud van het scherm worden afzonderlijk geanimeerd, wat een hiërarchie-effect creëert.
CupertinoPageRoute imiteert UINavigationController van iOS. Het nieuwe scherm komt van rechts binnen en bedekt het vorige. Het belangrijkste kenmerk — ondersteuning voor het interactieve veeg-terug gebaar, geïmplementeerd via CupertinoBackGestureDetector. Dit gebaar wordt zelfs midden in de animatie verwerkt, wat natuurlijk gedrag biedt dat bekend is voor iPhone-gebruikers.
Route heeft zijn eigen levenscyclus die verschilt van de levenscyclus van een gewone StatefulWidget. Het begrijpen van deze cyclus is noodzakelijk voor correcte initialisatie van gegevens, abonneren op streams en vrijgeven van bronnen bij het sluiten van het scherm.
De levenscyclus van Route bestaat uit vier hoofdfasen. Transition — Route wordt gemaakt en geanimeerd bij binnenkomst (didPush wordt aangeroepen). Active — Route wordt volledig weergegeven en interageert met de gebruiker. Inactive — een andere Route bedekt de huidige (dialoog, onderste scherm), maar Route blijft in de stack. Disposed — Route wordt uit de stack verwijderd en vernietigd, didPop en dispose worden aangeroepen.
De levenscyclusmethoden van Route kunnen worden overschreven in een aangepaste implementatie. Bijvoorbeeld, didPop wordt aangeroepen wanneer Route uit de stack wordt verwijderd — hier kan een concept van gegevens worden opgeslagen. didChangeNext wordt aangeroepen wanneer de volgende Route in de stack is veranderd — handig voor het bijwerken van de UI bij wijziging van de navigatiegeschiedenis.
Volgens Flutter API Route.didPop (2026) is het belangrijk om de levenscyclus van Route niet te verwarren met de levenscyclus van de State binnen Route. De StatefulWidget binnen Route heeft zijn eigen initState en dispose die respectievelijk in de Transition- en Disposed-fasen worden aangeroepen. Route leeft langer dan zijn interne State — Route blijft in de Overlay, zelfs wanneer zijn widgets tijdelijk verborgen zijn door een andere Route.
Route biedt mechanismen voor gegevensoverdracht zowel bij binnenkomst (bij creatie) als bij uitgang (bij voltooiing). Correcte gegevensoverdracht via Route elimineert de noodzaak voor globale variabelen en InheritedWidget, waardoor navigatie typeveilig en voorspelbaar wordt.
Voor gegevensoverdracht naar een nieuw scherm wordt de constructor van de ontvangende widget of het argument arguments in Navigator.pushNamed gebruikt. Binnen Route zijn de gegevens toegankelijk via RouteSettings.arguments die is opgeslagen in het Route-object. Deze aanpak werkt voor alle Route-types — MaterialPageRoute, CupertinoPageRoute en aangepaste implementaties.
Voor het retourneren van gegevens wordt het tweede argument Navigator.pop(context, result) gebruikt. Navigator.push retourneert een Future
Bij een directe aanroep van Navigator.push met MaterialPageRoute worden gegevens overgedragen via de constructor van het doelscherm. MethodChannel wordt niet gebruikt — het is pure Dart-interactie. Deze aanpak heeft de voorkeur voor typeveilige overdracht van complexe objecten.
Laten we een voorbeeld bekijken van het maken van een aangepaste Route met eigen animatie en gegevensoverdracht. PageRouteBuilder maakt het mogelijk om de in- en uitgangsanimatie te definiëren met volledige controle over de animatiecurve en duur.
// Aangepaste Route met schuifanimatie
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),
));
// Gegevens retourneren van scherm
ElevatedButton(
onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
child: const Text('Selecteer'),
);
// Resultaat ophalen op aanroepend scherm
final result = await Navigator.push(context, MaterialPageRoute(
builder: (context) => const SelectionPage(),
));
if (result != null) {
print('Geselecteerd: ${result['selected']}');
}
In het voorbeeld definieert PageRouteBuilder een aangepaste schuif-van-onder-animatie met transparantie. transitionDuration bepaalt de snelheid van de animatie. De code demonstreert ook het doorgeven van het resultaat: het detailscherm retourneert een Map met de keuze van de gebruiker, en het aanroepende scherm ontvangt deze gegevens via de Future van push. Route zorgt voor volledige isolatie: concepten op het detailscherm beïnvloeden de toestand van de lijst niet.
Veelgestelde vragen
Route — is een object dat het scherm op navigatieniveau beheert: het slaat animatie, ModalBarrier en levenscyclus op. Widget — is een beschrijving van een deel van de interface. Route bevat een Widget in zichzelf, maar biedt ook diensten (Overlay-laag, Hero-animatie) die niet beschikbaar zijn voor gewone widgets. Eén Route kan een complexe widgethiërarchie van elke diepte bevatten.
Gebruik PageRouteBuilder met parameters pageBuilder (schermconstructie) en transitionsBuilder (animatiedefinitie). In transitionsBuilder zijn animation (0.0–1.0) en secondaryAnimation voor parallelle animaties beschikbaar. Voor volledige controle maakt u een subklasse van Route en overschrijft u buildPage, createAnimationController en buildTransitions, wat toegang geeft tot laag-niveau AnimationControllers.
Gebruik voor het doorgeven van complexe objecten de constructor van het doelscherm bij directe Navigator.push of het argument arguments bij pushNamed. Zorg ervoor dat het object serialiseerbaar is (Map, JSON of aangepaste klasse). Voor typeveilige overdracht in Flutter worden freezed- of json_serializable-modellen gebruikt die correcte deserialisatie garanderen bij overdracht via RouteSettings.
Route.dispose wordt niet aangeroepen als Route in de Navigator-stack blijft. Bijvoorbeeld, bij het openen van een nieuwe Route gaat de oude Route naar een inactieve toestand (Inactive), maar wordt niet vernietigd — hij blijft in de stack voor snelle terugkeer. Dispose wordt alleen aangeroepen bij verwijdering van Route uit de stack via pop, pushReplacement of pushAndRemoveUntil. Gebruik voor het vrijgeven van bronnen de dispose van de State binnen Route, niet de dispose van Route zelf.
Gebruik ModalRoute.of(context) om de huidige Route uit BuildContext te halen. De eigenschap ModalRoute.isActive geeft aan of Route het huidige zichtbare scherm is. ModalRoute.isCurrent — true als Route de top van de stack is. Voor het observeren van stackwijzigingen abonneert u zich op Navigator-waarnemers via RouteAware en RouteObserver, die melding geven bij verandering van de actieve Route.
Samenvatting
We ontwikkelen een mobiele applicatie turnkey
IT Sectr creëert sinds 2017 iOS- en Android-applicaties voor startups en bedrijven. We adviseren u en stellen de beste oplossing voor.
Lees ook