Route — vad är det, typer och skapande av rutter i Flutter

Författare: IT Sectr Publicerad: 2026-07-02 Lästid: 8 min

Route — är en abstrakt klass i Flutter som representerar en separat skärm eller sida i Navigators navigationshistorik. Konkreta implementeringar av Route — MaterialPageRoute, CupertinoPageRoute och PlatformRoute — bestämmer hur skärmen visas och vilken animation som används vid övergången. Till skillnad från en vanlig widget har Route en egen livscykel med metoderna didPush, didPop, didReplace och didChangeNext. Enligt Flutter API Reference (2026) hanterar varje Route ModalBarrier, tar hänsyn till plattformsspecifika egenskaper (svep tillbaka på iOS) och säkerställer isolering av tillstånd mellan skärmar.

Huvudpunkter

  • Route — abstrakt skärmklass i Flutter med egen livscykel (didPush, didPop, didReplace, didChangeNext)
  • MaterialPageRoute — standardimplementering av Route med Material-animation (skjut från botten) för Android och desktop
  • CupertinoPageRoute — implementering av Route med iOS-animation (skjut från höger + svep-tillbaka gest) för iPhone och iPad
  • Livscykel — Route genomgår faser: övergång (Transition), visning (Active), döljning (Inactive) och förstöring (Disposed)
  • Dataöverföring — Route tar emot argument via konstruktorn och returnerar resultat via Future vid slutförande

Vad är Route i Flutter

Route — är grunden för Flutters navigationssystem. Varje skärm som användaren ser i appen representeras av ett Route-objekt som finns i Navigator-stacken. Route abstraherar skärmen från hanteringskoden: Navigator lägger till och tar bort Route, och inuti Route finns gränssnittet som användaren ser. Denna arkitektur separerar ansvaret mellan navigering och visning.

Till skillnad från enkel widget-ersättning tillhandahåller Route tjänster som inte är tillgängliga för vanliga widgets: ModalBarrier (dämpning av bakgrunden vid en öppen dialog), hantering av in- och utträdesanimation, bearbetning av hårdvaruknappen „Tillbaka“ på Android och integrering med Hero-animation för smidiga övergångar mellan skärmar.

Enligt Flutter Cookbook (2026) är Route en nyckelelement för Hero-animation: Hero-widgeten på en Route animerar automatiskt övergången till Hero-widgeten på nästa Route, vilket skapar en „flygande“ elementeffekt. Detta är möjligt just för att Route håller båda skärmarna i Overlay under animationen.

Route som byggsten för navigering

Route är grunden för både enkla mobilappar (via Navigator 1.0) och komplexa scenarier med djupa länkar (Navigator 2.0). I Navigator 2.0 representerar Route en Page som RouterDelegate konverterar från routkonfigurationen. Att förstå Route är alltså nödvändigt för att arbeta med vilket Flutter-navigationssystem som helst — oavsett valt tillvägagångssätt eller paket.

Typer av Route: MaterialPageRoute och CupertinoPageRoute

Flutter erbjuder flera inbyggda implementeringar av Route, som var och en anpassar beteendet för en specifik plattform. Valet av rätt Route-typ påverkar användarupplevelsen: Material-animation på Android och Cupertino-animation på iOS skapar känslan av en „nativ“ app.

Route-typAnimationPlattformFunktioner
MaterialPageRouteSkjut från botten till toppenAndroid, desktopskugga vid övergång, automatisk SafeArea-hantering
CupertinoPageRouteSkjut från höger till vänsteriOS, iPadOSsvep-tillbaka gest, transparent bakgrund vid övergång
PlatformRouteAutomatiskt valAlla plattformarväljer typ baserat på TargetPlatform
PageRouteBuilderAnpassadAlla plattformarfull kontroll över animation via AnimationController

MaterialPageRoute: standard för Android

MaterialPageRoute — den mest använda implementeringen av Route. Den animerar inträdet av en ny skärm från botten till toppen med gradvis uppträdande. Vid utträde animeras skärmen från toppen till botten och återgår till startpositionen. Verktygsfältet (AppBar) och skärmens kropp animeras separat, vilket skapar en hierarkieffekt.

CupertinoPageRoute: iOS-navigationsstil

CupertinoPageRoute imiterar UINavigationController från iOS. Den nya skärmen kommer in från höger och täcker den föregående. Huvudfunktionen — stöd för den interaktiva svep-tillbaka-gesten, implementerad via CupertinoBackGestureDetector. Denna gest bearbetas även mitt i animationen och ger naturligt beteende som är bekant för iPhone-användare.

Routes livscykel: från skapande till förstöring

Route har en egen livscykel som skiljer sig från livscykeln för en vanlig StatefulWidget. Att förstå denna cykel är nödvändigt för korrekt initiering av data, prenumeration på strömmar och frigöring av resurser vid stängning av skärmen.

Faser i Routes livscykel

Routes livscykel består av fyra huvudfaser. Transition — Route skapas och animeras vid inträde (didPush anropas). Active — Route visas fullständigt och interagerar med användaren. Inactive — en annan Route täcker den nuvarande (dialog, botten-skärm), men Route förblir i stacken. Disposed — Route tas bort från stacken och förstörs, didPop och dispose anropas.

Livscykelmetoderna för Route kan åsidosättas i en anpassad implementering. Till exempel anropas didPop när Route tas bort från stacken — här kan ett utkast av data sparas. didChangeNext anropas när nästa Route i stacken har ändrats — användbart för att uppdatera UI vid ändring av navigeringshistoriken.

Enligt Flutter API Route.didPop (2026) är det viktigt att inte blanda ihop Routes livscykel med livscykeln för State inuti Route. StatefulWidget inuti Route har egna initState och dispose som anropas i Transition- respektive Disposed-fasen. Route lever längre än sitt interna State — Route förblir i Overlay även när dess widgets tillfälligt döljs av en annan Route.

Dataöverföring via Route mellan skärmar

Route tillhandahåller mekanismer för dataöverföring både vid inmatning (vid skapande) och vid utmatning (vid slutförande). Korrekt dataöverföring via Route eliminerar behovet av globala variabler och InheritedWidget, vilket gör navigeringen typsäker och förutsägbar.

För dataöverföring till en ny skärm används konstruktorn för den mottagande widgeten eller argumentet arguments i Navigator.pushNamed. Inuti Route är data tillgängliga via RouteSettings.arguments som lagras i Route-objektet. Detta tillvägagångssätt fungerar för alla Route-typer — MaterialPageRoute, CupertinoPageRoute och anpassade implementeringar.

För att returnera data används det andra argumentet Navigator.pop(context, result). Navigator.push returnerar en Future som slutförs med värdet som skickades i pop. Om pop anropas utan argument slutförs Future med null. Denna mekanism är motsvarigheten till startActivityForResult i Android och completion handler i iOS, men implementerad via Dart Futures.

Exempel på dataöverföring via Routes konstruktor

Vid direkt anrop av Navigator.push med MaterialPageRoute överförs data via konstruktorn för målgående skärm. MethodChannel används inte — det är ren Dart-interaktion. Detta tillvägagångssätt är att föredra för typsäker överföring av komplexa objekt.

Exempel på att skapa en anpassad Route

Låt oss titta på ett exempel på att skapa en anpassad Route med egen animation och dataöverföring. PageRouteBuilder gör det möjligt att definiera in- och utträdesanimation med full kontroll över animationskurvan och varaktigheten.

dart
// Anpassad Route med skjutanimation
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),
));

// Returnera data från skärm
ElevatedButton(
  onPressed: () => Navigator.of(context).pop({'selected': true, 'id': '42'}),
  child: const Text('Välj'),
);

// Hämta resultat på anropande skärm
final result = await Navigator.push(context, MaterialPageRoute(
  builder: (context) => const SelectionPage(),
));
if (result != null) {
  print('Valt: ${result['selected']}');
}

I exemplet definierar PageRouteBuilder en anpassad skjut-från-botten-animation med transparens. transitionDuration ställer in animationens hastighet. Koden visar också överföring av resultatet: detaljskärmen returnerar en Map med användarens val, och den anropande skärmen får dessa data via Future från push. Route säkerställer fullständig isolering: utkast på detaljskärmen påverkar inte listans tillstånd.

Vanliga frågor

Vad är skillnaden mellan Route och Widget i Flutter?

Route — är ett objekt som hanterar skärmen på navigeringsnivå: lagrar animation, ModalBarrier och livscykel. Widget — är en beskrivning av en del av gränssnittet. Route innehåller en Widget i sig, men tillhandahåller också tjänster (Overlay-lager, Hero-animation) som inte är tillgängliga för vanliga widgets. En enda Route kan innehålla en komplex widget-hierarki av vilket djup som helst.

Hur skapar man en Route med anpassad animation?

Använd PageRouteBuilder med parametrarna pageBuilder (skärmkonstruktion) och transitionsBuilder (animationsdefinition). I transitionsBuilder finns animation (0.0–1.0) och secondaryAnimation för parallella animationer tillgängliga. För full kontroll, skapa en underklass av Route och åsidosätt buildPage, createAnimationController och buildTransitions, vilket ger tillgång till lågnivå AnimationController.

Hur överför man ett komplext objekt mellan Routes?

För överföring av komplexa objekt, använd konstruktorn för målgående skärm vid direkt Navigator.push eller argumentet arguments vid pushNamed. Se till att objektet är serialiserbart (Map, JSON eller anpassad klass). För typsäker överföring i Flutter används freezed- eller json_serializable-modeller som garanterar korrekt deserialisering vid överföring via RouteSettings.

Varför kan Route inte anropa dispose?

Route.dispose anropas inte om Route förblir i Navigator-stacken. Till exempel, vid öppnande av en ny Route går den gamla Route till ett inaktivt tillstånd (Inactive), men förstörs inte — den förblir i stacken för snabb återgång. Dispose anropas endast vid borttagning av Route från stacken via pop, pushReplacement eller pushAndRemoveUntil. För frigöring av resurser, använd dispose av State inuti Route, inte dispose av Route själv.

Hur kontrollerar man vilken Route som är aktiv nu?

Använd ModalRoute.of(context) för att få den aktuella Route från BuildContext. Egenskapen ModalRoute.isActive visar om Route är den för närvarande synliga skärmen. ModalRoute.isCurrent — true om Route är överst i stacken. För att observera förändringar i stacken, prenumerera på Navigator-observatörer via RouteAware och RouteObserver, som meddelar om förändring av aktiv Route.

Sammanfattning

  • Route — abstrakt skärmklass i Flutter med livscykel (didPush, didPop, didReplace, didChangeNext) och stöd för ModalBarrier och Hero-animation
  • MaterialPageRoute — implementering för Android med skjut-från-botten-animation, skugga och automatisk SafeArea
  • CupertinoPageRoute — implementering för iOS med skjut-från-höger-animation och interaktiv svep-tillbaka gest
  • PageRouteBuilder — verktyg för att skapa Route med anpassad animation via transitionsBuilder och AnimationController
  • Dataöverföring — via Routes konstruktor (push) eller arguments (pushNamed) vid inmatning; via Navigator.pop(context, result) vid utmatning med Future
  • Livscykel — fyra faser: Transition (didPush), Active, Inactive (täckt av annan Route), Disposed (didPop + dispose)
  • Skärmisolering — varje Route har egen BuildContext och tillstånd, vilket förhindrar läckor och förenklar datahantering

Vi utvecklar en mobil applikation nyckelfärdigt

IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.

Diskutera projektet

Läs också