Navigator: správa obrazovek ve Flutter

Autor: IT Sectr Publikováno: 2026-07-02 Doba čtení: 9 min

Navigator — je widget-manager navigace ve Flutter, který spravuje zásobník tras (Route) pro přesun mezi obrazovkami pomocí metod push, pop, pushReplacement a pushNamed. Na rozdíl od přímého nahrazování widgetů přes State, Navigator pracuje na úrovni celých obrazovek: ukládá historii přechodů a podporuje platformní animace. Podle Flutter API Reference (2026), Navigator 2.0 (Router) poskytuje deklarativní správu navigace pro složité scénáře s hlubokými odkazy a adaptivním designem. V typické aplikaci Navigator zajišťuje správné chování tlačítka „Zpět" na Androidu a gest přetažení na iOS.

Hlavní body

  • Navigator — manažer navigace, spravuje zásobník tras pomocí push, pop, pushNamed, pushReplacement a pushAndRemoveUntil
  • Zásobník tras — Navigator ukládá obrazovky v zásobníku LIFO: každý push přidá obrazovku na vrchol, pop odstraní vrchní
  • pushNamed — navigace po pojmenovaných trasách definovaných v MaterialApp.routes nebo onGenerateRoute
  • pushReplacement — nahrazení aktuální obrazovky novou bez možnosti návratu k předchozí (např. po přihlášení)
  • Navigator 2.0 — deklarativní API s Router, RouterDelegate a RouteInformationParser pro webovou a desktopovou navigaci

Co je Navigator ve Flutter

Navigator — je widget, který spravuje zásobník objektů Route a implementuje navigaci obrazovek ve Flutter aplikaci. Každé volání push umístí nový Route na vrchol zásobníku, pop odstraní vrchní Route a vrátí se na předchozí obrazovku. MaterialApp automaticky vytváří Navigator pro celou aplikaci a zpřístupňuje jej pomocí Navigator.of(context).

Na rozdíl od StatefulWidget, kde k nahrazení obsahu dochází pomocí setState uvnitř jednoho widgetu, Navigator pracuje s celými obrazovkami s vlastním životním cyklem. Každý Route v zásobníku je izolovaný stav s vlastním BuildContext, což zabraňuje únikům paměti a zjednodušuje správu závislostí. Při volání pop je nepoužívaný Route zničen a uvolňuje zdroje.

Podle Flutter Navigation Guide (2026), Navigator se vyvinul z imperativního API (Navigator 1.0) na deklarativní (Navigator 2.0). Navigator 1.0 používá metody push/pop přímo, což je vhodné pro jednoduché scénáře. Navigator 2.0 (Router) je vhodný pro aplikace s hlubokými odkazy, adaptivní navigací a webovým směrováním.

Jak Navigator funguje pod kapotou

Uvnitř Navigator používá Overlay — speciální widget, který zobrazuje Route jeden přes druhý. Každý Route vytváří svou vlastní pozici v Overlay s Z-indexem odpovídajícím hloubce v zásobníku. To vysvětluje, proč se při push nová obrazovka animuje nad předchozí, a při pop — předchozí obrazovka je již připravena k zobrazení: nebyla zničena, pouze zůstala v Overlay pod novou.

Pro animace přechodů Navigator používá PageTransitionsTheme, který lze přepsat v ThemeData. Platformní animace se nastavují pomocí CupertinoPageRoute pro iOS (posun zprava) a MaterialPageRoute pro Android (posun zdola). Navigator automaticky vybírá správnou animaci při použití PlatformRoute.

Navigator poskytuje sadu metod pro správu zásobníku Route. Každá metoda řeší konkrétní úkol navigace — od jednoduchého přechodu až po úplné nahrazení historie obrazovek. Podívejme se na hlavní metody s příklady použití.

Scénář použití

MetodaPopis
pushPřidá Route na vrchol zásobníkuPřechod na novou obrazovku s možností návratu
popOdstraní vrchní Route ze zásobníkuNávrat na předchozí obrazovku
pushReplacementNahradí aktuální Route novýmPo přihlášení — přihlašovací obrazovka nahrazena hlavní
pushAndRemoveUntilPřidá Route a odstraní předchozí do podmínkyVýstup na hlavní obrazovku s vymazáním historie
popUntilOdstraňuje Route ze zásobníku do splnění podmínkyNávrat na konkrétní obrazovku v historii
maybePopZavolá pop pouze pokud zásobník obsahuje >1 RouteZabránění zavření aplikace při náhodném stisku

Push a Pop: základní operace

Metoda push přijímá Route a vrací Future s výsledkem předaným při pop. To umožňuje přijímat data z obrazovky, na kterou jsme přešli. Například obrazovka výběru data může vrátit DateTime pomocí Navigator.pop(context, selectedDate). Metoda pop bez argumentu vrací null, s argumentem — předává hodnotu volající obrazovce.

PushReplacement: nahrazení obrazovky

pushReplacement nahrazuje aktuální Route novým, odstraňujíc aktuální ze zásobníku. To je klíčové ve scénářích, kde by se uživatel neměl vracet na předchozí obrazovku. Typický příklad — přihlašovací obrazovka: po úspěšném přihlášení je aktuální obrazovka nahrazena hlavní a tlačítko „Zpět" se nevrací k přihlašovacímu formuláři.

Pojmenované trasy a onGenerateRoute

Navigator podporuje navigaci po pojmenovaných trasách pomocí metody pushNamed. Místo přímého vytváření Route vývojář zadá textový identifikátor a Navigator automaticky vytvoří Route na základě konfigurace v MaterialApp. To zjednodušuje kód a centralizuje definici tras na jedno místo.

Pojmenované trasy se definují pomocí vlastnosti routes v MaterialApp, kde každý klíč je řetězec cesty a hodnota je funkce vracející Widget. Pro dynamické trasy (s parametry) se používá onGenerateRoute — callback, který přijímá RouteSettings a vrací Route. To umožňuje předávání argumentů přes arguments a implementaci hluboké navigace.

Podle Flutter Cookbook (2026), předávání argumentů přes pushNamed se provádí pomocí parametru arguments: Object?. Přijímající obrazovka extrahuje argumenty přes ModalRoute.of(context)!.settings.arguments, což zajišťuje typově bezpečný přenos dat bez globálních proměnných nebo InheritedWidget.

Zpracování neznámých tras

Vlastnost onUnknownRoute v MaterialApp zpracovává případy, kdy je pushNamed volán s neexistující trasou. To je užitečné pro zobrazení obrazovky 404 nebo přesměrování na hlavní stránku. V kombinaci s onGenerateRoute zajišťuje úplné pokrytí všech možných navigačních scénářů.

Navigator 2.0 (známý také jako Router API) — je deklarativní přístup k navigaci, představený ve Flutter 2.0. Na rozdíl od imperativního Navigator 1.0, kde vývojář volá push/pop, Router spravuje navigaci pomocí stavu, automaticky synchronizuje URL prohlížeče s aktuální obrazovkou. To je zvláště důležité pro webové aplikace a desktopové verze.

Architektura Navigator 2.0 se skládá ze tří klíčových komponent: RouteInformationParser parsuje URL do konfigurace trasy, RouterDelegate převádí konfiguraci na seznam Route, a BackButtonDispatcher zpracovává systémové tlačítko „Zpět". Taková architektura činí navigaci zcela předvídatelnou a testovatelnou.

Pro zjednodušení práce s Navigator 2.0 existují wrapper balíčky: go_router (doporučený Googlem), auto_route a beamer. go_router poskytuje deklarativní DSL pro definici tras s podporou vnořené navigace, přesměrování a hlubokých odkazů bez ruční implementace RouterDelegate. Podle pub.dev (2026), go_router se používá ve 35% nových Flutter projektů, které preferují deklarativní přístup.

Podívejme se na příklad Navigator s pojmenovanými trasami a přenosem dat mezi obrazovkami. Kód demonstruje obrazovku seznamu produktů, přechod na detailní obrazovku a návrat s výsledkem.

dart
// Konfigurace tras v MaterialApp
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(),
    );
  },
)

// Navigace s předáváním dat
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Získání dat na přijímající obrazovce
final args = ModalRoute.of(context)!.settings.arguments as String;

// Nahraď obrazovku po přihlášení
Navigator.pushReplacementNamed(context, '/home');

// Vymaž zásobník na hlavní obrazovku
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

V příkladu Navigator.pushNamed předává identifikátor produktu detailní obrazovce. Při návratu přes Navigator.pop(context, updatedProduct) volající obrazovka obdrží aktualizovaná data v proměnné result. pushReplacementNamed nahrazuje aktuální obrazovku po autorizaci a pushNamedAndRemoveUntil s podmínkou (route) => false zcela vymaže zásobník a zabrání návratu na předchozí obrazovky.

Často kladené otázky

Jaký je rozdíl mezi Navigator 1.0 a Navigator 2.0?

Navigator 1.0 — imperativní API s metodami push a pop, vhodné pro jednoduché mobilní aplikace. Navigator 2.0 — deklarativní API přes Router, RouterDelegate a RouteInformationParser, nezbytné pro webové aplikace s URL směrováním, hlubokými odkazy a adaptivní navigací. Pro praktické projekty se doporučuje go_router jako zjednodušený wrapper nad Navigator 2.0.

Jak předat data mezi obrazovkami přes Navigator?

Data se předávají přes argument arguments v pushNamed nebo přímo přes konstruktor Route. Na přijímající obrazovce se data extrahují přes ModalRoute.of(context)!.settings.arguments. Pro vrácení dat použijte Navigator.pop(context, result) — volající obrazovka obdrží výsledek jako hodnotu Future vráceného z push.

Proč tlačítko „Zpět" nevrací na předchozí obrazovku?

To se stane, pokud byla aktuální obrazovka otevřena přes pushReplacement, který odstraňuje předchozí Route ze zásobníku. V tomto případě neexistuje historie navigace a tlačítko „Zpět" zavře aplikaci. Pro návrat použijte běžný push, ne pushReplacement. Zkontrolujte také, že volání Navigator.pop je správně zpracováno na aktuální obrazovce.

Jak zabránit návratu na předchozí obrazovku?

Použijte pushReplacement pro nahrazení aktuální obrazovky novou — předchozí obrazovka je odstraněna ze zásobníku a nelze se k ní vrátit. Pro úplné vymazání historie použijte pushAndRemoveUntil s podmínkou (route) => false. Alternativně můžete přepsat WillPopScope (zastaralé) nebo PopScope pro zachycení systémového tlačítka „Zpět".

Co je go_router a kdy jej použít?

go_router — je deklarativní navigační balíček od Google, postavený na Navigator 2.0. Poskytuje jednoduché DSL pro definici tras s podporou vnoření, přesměrování, hlubokých odkazů a ShellRoute pro BottomNavigationBar. Použijte go_router v nových projektech, zejména pokud je vyžadována webová podpora nebo složité navigační vzory s chráněnými trasami.

Shrnutí

  • Navigator — manažer navigace Flutter, spravuje zásobník Route s metodami push, pop, pushReplacement a pushAndRemoveUntil
  • LIFO zásobník — každý push přidá Route na vrchol, pop odstraní vrchní; zásobník ukládá historii přechodů podle principu „poslední dovnitř, první ven"
  • pushReplacement — nahrazení aktuální obrazovky bez možnosti návratu, klíčové pro scénáře přihlášení a onboardingu
  • Pojmenované trasy — pushNamed s RouteSettings a onGenerateRoute pro centralizovanou definici tras s předáváním argumentů
  • Navigator 2.0 — deklarativní navigace přes Router, RouterDelegate a RouteInformationParser pro webové hluboké odkazy
  • go_router — doporučený Google wrapper nad Navigator 2.0 s jednoduchým DSL a podporou ShellRoute
  • Předávání dat — přes arguments v pushNamed a vrácení výsledku přes Future z push pomocí Navigator.pop(context, value)

Vyvineme mobilní aplikaci na klíč

IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.

Prodiskutovat projekt

Přečtěte si také