Navigator: képernyők kezelése a Flutterben

Szerző: IT Sectr Megjelenés: 2026-07-02 Olvasási idő: 9 perc

Navigator — egy navigációs widget-manager a Flutterben, amely a push, pop, pushReplacement és pushNamed metódusok segítségével kezeli a Route-ok vermét a képernyők közötti mozgáshoz. Ellentétben a widgetek közvetlen cseréjével a State által, a Navigator teljes képernyők szintjén működik: tárolja az átmenetek előzményeit és támogatja a platform animációkat. A Flutter API Reference (2026) szerint a Navigator 2.0 (Router) deklaratív navigációs kezelést biztosít összetett forgatókönyvekhez mély linkekkel és adaptív dizájnnal. Egy tipikus alkalmazásban a Navigator biztosítja a „Vissza” gomb helyes viselkedését Androidon és a lapozó mozdulatok működését iOS-en.

Főbb pontok

  • Navigator — navigációs manager, amely a push, pop, pushNamed, pushReplacement és pushAndRemoveUntil metódusokkal kezeli a Route vermet
  • Route verem — a Navigator LIFO veremben tárolja a képernyőket: minden push hozzáad egy képernyőt a tetejére, a pop eltávolítja a legfelsőt
  • pushNamed — navigáció elnevezett útvonalakon, amelyek a MaterialApp.routes vagy onGenerateRoute függvényben vannak definiálva
  • pushReplacement — az aktuális képernyő cseréje újra anélkül, hogy vissza lehetne térni az előzőhöz (például bejelentkezés után)
  • Navigator 2.0 — deklaratív API Router, RouterDelegate és RouteInformationParser segítségével web és desktop navigációhoz

Mi az a Navigator a Flutterben

Navigator — egy widget, amely a Route objektumok vermét kezeli és képernyő navigációt valósít meg a Flutter alkalmazásban. Minden push hívás egy új Route-ot helyez a verem tetejére, a pop eltávolítja a legfelső Route-ot és visszatér az előző képernyőre. A MaterialApp automatikusan létrehoz egy Navigatort a teljes alkalmazáshoz, elérhetővé téve azt a Navigator.of(context) segítségével.

Ellentétben a StatefulWidget-dzsal, ahol a tartalom cseréje setState révén történik egyetlen widgeten belül, a Navigator teljes képernyőkkel működik, saját életciklussal. Minden Route a veremben egy elkülönített állapot saját BuildContext-tel, ami megakadályozza a memóriaszivárgást és egyszerűsíti a függőségek kezelését. Pop híváskor a nem használt Route megsemmisül, felszabadítva az erőforrásokat.

A Flutter Navigation Guide (2026) szerint a Navigator az imperatív API-ból (Navigator 1.0) a deklaratív felé (Navigator 2.0) fejlődött. A Navigator 1.0 közvetlenül használja a push/pop metódusokat, ami egyszerű forgatókönyvekhez kényelmes. A Navigator 2.0 (Router) mély linkeket, adaptív navigációt és web útvonalválasztást igénylő alkalmazásokhoz alkalmas.

Hogyan működik a Navigator a motorháztető alatt

Belül a Navigator Overlay-t használ — egy speciális widgetet, amely egymás fölött jeleníti meg a Route-okat. Minden Route létrehozza a saját pozícióját az Overlay-ben egy Z-indexszel, ami megfelel a verembléli mélységnek. Ez megmagyarázza, miért animálódik push-nál az új képernyő az előző fölé, és pop-nál az előző képernyő már kész a megjelenítésre: nem semmisülték meg, csak az Overlay-ben maradt az új alatt.

Az átmeneti animációkhoz a Navigator a PageTransitionsTheme-et használja, ami felülírható a ThemeData-ban. A platform animációk a CupertinoPageRoute segítségével állíthatók be iOS-hez (jobbról csúsztás) és a MaterialPageRoute segítségével Androidhoz (alulról csúsztás). A Navigator automatikusan kiválasztja a megfelelő animációt a PlatformRoute használatakor.

Navigator egy sor metódust kínál a Route verem kezeléséhez. Minden metódus egy adott navigációs feladatot old meg — az egyszerű átmenettől a képernyő-előzmények teljes cseréjéig. Nézzük meg a fő metódusokat használati példákkal.

MetódusLeírásAlkalmazási forgatókönyv
pushRoute hozzáadása a verem tetejéhezÁttérés új képernyőre visszatérési lehetőséggel
popLegfelső Route eltávolítása a verembőlVisszatérés az előző képernyőre
pushReplacementAktuális Route cseréje újraBejelentkezés után — a bejelentkező képernyőt felváltja a fő képernyő
pushAndRemoveUntilRoute hozzáadása és előzők eltávolítása feltételigKilépés a fő képernyőre az előzmények törlésével
popUntilRoute-ok eltávolítása a veremből a feltétel eléréséigVisszatérés egy adott képernyőre az előzményekben
maybePopPop hívása csak ha a verem >1 Route-ot tartalmazAlkalmazás bezárásának megakadályozása véletlen megnyomáskor

Push és Pop: alapműveletek

A push metódus fogad egy Route-ot és visszaad egy Future-t a pop-nál átadott eredménnyel. Ez lehetővé teszi az adatok fogadását arról a képernyőről, amelyre navigáltunk. Például egy dátumválasztó képernyő visszaadhat DateTime-t a Navigator.pop(context, selectedDate) segítségével. A pop metódus argumentum nélkül null-t ad vissza, argumentummal — átadja az értéket a hívó képernyőnek.

PushReplacement: képernyő csere

pushReplacement lecseréli az aktuális Route-ot egy újra, eltávolítva az aktuálist a veremből. Ez kritikus azokban a forgatókönyvekben, ahol a felhasználó nem térhet vissza az előző képernyőre. Tipikus példa — bejelentkező képernyő: sikeres bejelentkezés után az aktuális képernyőt felváltja a fő képernyő, és a „Vissza” gomb nem tér vissza a bejelentkező űrlaphoz.

Elnevezett útvonalak és onGenerateRoute

Navigator támogatja a navigációt elnevezett útvonalakon a pushNamed metódus segítségével. A Route közvetlen létrehozása helyett a fejlesztő megad egy szöveges azonosítót, és a Navigator automatikusan létrehozza a Route-ot a MaterialApp konfigurációja alapján. Ez egyszerűsíti a kódot és központosítja az útvonalak definiálását egy helyre.

Az elnevezett útvonalakat a MaterialApp routes tulajdonságán keresztül definiáljuk, ahol minden kulcs egy útvonal sztring, és az érték egy Widget-et visszaadó függvény. Dinamikus útvonalakhoz (paraméterekkel) az onGenerateRoute használható — egy visszahívás, amely RouteSettings-et kap és Route-ot ad vissza. Ez lehetővé teszi argumentumok átadását az arguments segítségével és mély navigáció megvalósítását.

A Flutter Cookbook (2026) szerint az argumentumok átadása pushNamed segítségével az arguments: Object? paraméter segítségével történik. A fogadó képernyő az argumentumokat a ModalRoute.of(context)!.settings.arguments segítségével nyeri ki, ami típusbiztos adatátvitelt biztosít globális változók vagy InheritedWidget nélkül.

Ismeretlen útvonalak kezelése

A MaterialApp onUnknownRoute tulajdonsága kezeli azokat az eseteket, amikor a pushNamed nem létező útvonallal kerül meghívásra. Ez hasznos egy 404-es képernyő megjelenítéséhez vagy átirányításhoz a főoldalra. Az onGenerateRoute-dzsal kombinálva biztosítja az összes lehetséges navigációs forgatókönyv teljes lefedését.

Navigator 2.0 (még Router API-ként is ismert) — egy deklaratív megközelítés a navigációhoz, amelyet a Flutter 2.0-ban vezettek be. Ellentétben az imperatív Navigator 1.0-val, ahol a fejlesztő push/pop-ot hív, a Router állapoton keresztül kezeli a navigációt, automatikusan szinkronizálva a böngésző URL-jét az aktuális képernyővel. Ez különösen fontos webalkalmazások és asztali változatok esetén.

A Navigator 2.0 architektúrája három kulcsfontosságú összetevőből áll: a RouteInformationParser az URL-t útvonal-konfigurációvá elemzi, a RouterDelegate átalakítja a konfigurációt Route-ok listájává, a BackButtonDispatcher pedig kezeli a rendszer „Vissza” gombját. Ez az architektúrá teljesen kiszámíthatóvá és tesztelhetővé teszi a navigációt.

A Navigator 2.0-val való munka egyszerűsítésére léteznek csomagoló könyvtárak: go_router (a Google ajánlásával), auto_route és beamer. A go_router egy deklaratív DSL-t biztosít az útvonalak definiálásához, támogatva a beágyazott navigációt, átirányításokat és mély linkeket a RouterDelegate kézi megvalósítása nélkül. A pub.dev (2026) szerint a go_router-t az új Flutter projektek 35%-ában használják, amelyek a deklaratív megközelítést részesítik előnyben.

Nézzünk egy példát a Navigator-ra elnevezett útvonalakkal és adatátvitellel a képernyők között. A kód bemutat egy terméklista képernyőt, átmenetet a részlet képernyőre és visszatérést az eredménnyel.

dart
// Útvonal konfiguráció a MaterialApp-ban
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(),
    );
  },
)

// Navigáció adatátvitellel
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Adatok lekérése a fogadó képernyőn
final args = ModalRoute.of(context)!.settings.arguments as String;

// Képernyő cseréje bejelentkezés után
Navigator.pushReplacementNamed(context, '/home');

// Verem ürítése a fő képernyőig
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

A példában a Navigator.pushNamed átadja a termékazonosítót a részlet képernyőnek. A Navigator.pop(context, updatedProduct) segítségével történő visszatéréskor a hívó képernyő megkapja a frissített adatokat a result változóban. A pushReplacementNamed lecseréli az aktuális képernyőt engedélyezés után, a pushNamedAndRemoveUntil pedig (route) => false feltétellel teljesen kiüríti a vermet, megakadályozva a visszatérést az előző képernyőkre.

Gyakran Ismételt Kérdések

Mi a különbség a Navigator 1.0 és a Navigator 2.0 között?

Navigator 1.0 — imperatív API push és pop metódusokkal, kényelmes egyszerű mobilalkalmazásokhoz. Navigator 2.0 — deklaratív API Router, RouterDelegate és RouteInformationParser segítségével, amely URL útvonalválasztást, mély linkeket és adaptív navigációt igénylő webalkalmazásokhoz szükséges. Gyakorlati projektekhez a go_router ajánlott egyszerűsített csomagolóként a Navigator 2.0 fölött.

Hogyan lehet adatokat átvinni a képernyők között a Navigator segítségével?

Az adatok átadása a pushNamed arguments argumentumán keresztül vagy közvetlenül a Route konstruktorán keresztül történik. A fogadó képernyőn az adatok a ModalRoute.of(context)!.settings.arguments segítségével kérhetők le. Az adatok visszaadásához használja a Navigator.pop(context, result) függvényt — a hívó képernyő az eredményt a push által visszaadott Future értékéként kapja meg.

Miért nem tér vissza a „Vissza” gomb az előző képernyőre?

Ez akkor történik, ha az aktuális képernyő pushReplacement segítségével nyílt meg, ami eltávolítja az előző Route-ot a veremből. Ebben az esetben nincs navigációs előzmény, és a „Vissza” gomb bezárja az alkalmazást. A visszatéréshez használjon szokásos push-t, ne pushReplacement-t. Ellenőrizze azt is, hogy a Navigator.pop hívás megfelelően van-e kezelve az aktuális képernyőn.

Hogyan akadályozható meg a visszatérés az előző képernyőre?

Használja a pushReplacement-t az aktuális képernyő lecserélésére egy újra — az előző képernyő eltávolításra kerül a veremből, és nem lehet visszatérni hozzá. A teljes előzmény törléséhez használja a pushAndRemoveUntil függvényt a (route) => false feltétellel. Alternatívaként felülírhatja a WillPopScope (elavult) vagy a PopScope függvényt a rendszer „Vissza” gombjának elfogásához.

Mi az a go_router és mikor használjuk?

go_router — egy deklaratív navigációs csomag a Google-től, amely a Navigator 2.0-ra épül. Egyszerű DSL-t biztosít az útvonalak definiálásához, támogatva a beágyazást, átirányításokat, mély linkeket és ShellRoute-t a BottomNavigationBar számára. Használja a go_router-t új projektekben, különösen ha web támogatásra vagy összetett navigációs mintákra van szükség védett útvonalakkal.

Összefoglalás

  • Navigator — Flutter navigációs manager, amely a Route vermet push, pop, pushReplacement és pushAndRemoveUntil metódusokkal kezeli
  • LIFO verem — minden push hozzáad egy Route-ot a tetejére, a pop eltávolítja a legfelsőt; a verem az átmenetek előzményeit „utoljára be, először ki” elv szerint tárolja
  • pushReplacement — az aktuális képernyő cseréje visszatérés nélkül, kritikus a bejelentkezési és onboarding forgatókönyvekhez
  • Elnevezett útvonalak — pushNamed RouteSettings-szel és onGenerateRoute-val a központosított útvonal definícióhoz argumentum átadással
  • Navigator 2.0 — deklaratív navigáció Router, RouterDelegate és RouteInformationParser segítségével webes mély linkekhez
  • go_router — a Google által ajánlott csomagoló a Navigator 2.0 fölött egyszerű DSL-lel és ShellRoute támogatással
  • Adatátvitel — arguments segítségével pushNamed-ben és eredmény visszaadása a push-ból származó Future segítségével Navigator.pop(context, value) használatával

Kulcsrakész mobilalkalmazást fejlesztünk

Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.

Projekt megbeszélése

Olvassa el is