Navigator: zarządzanie ekranami we Flutter

Autor: IT Sectr Opublikowano: 2026-07-02 Czas czytania: 9 min

Navigator — to widget-menedżer nawigacji we Flutter, zarządzający stosem tras (Route) do przemieszczania się między ekranami za pomocą metod push, pop, pushReplacement i pushNamed. W przeciwieństwie do bezpośredniej zamiany widgetów przez State, Navigator działa na poziomie całych ekranów: przechowuje historię przejść i obsługuje animacje platformowe. Według Flutter API Reference (2026), Navigator 2.0 (Router) zapewnia deklaratywne zarządzanie nawigacją dla złożonych scenariuszy z głębokimi linkami i adaptacyjnym designem. W typowej aplikacji Navigator zapewnia poprawne działanie przycisku „Wstecz” na Androidzie i gestów przesunięcia na iOS.

Najważniejsze

  • Navigator — menedżer nawigacji, zarządzający stosem tras przez metody push, pop, pushNamed, pushReplacement i pushAndRemoveUntil
  • Stos tras — Navigator przechowuje ekrany w stosie LIFO: każdy push dodaje ekran na górę, pop usuwa górny
  • pushNamed — nawigacja po nazwanych trasach zdefiniowanych w MaterialApp.routes lub onGenerateRoute
  • pushReplacement — zamiana bieżącego ekranu na nowy bez możliwości powrotu do poprzedniego (np. po logowaniu)
  • Navigator 2.0 — deklaratywne API z Router, RouterDelegate i RouteInformationParser dla nawigacji webowej i desktopowej

Czym jest Navigator we Flutter

Navigator — to widget zarządzający stosem obiektów Route, który implementuje nawigację ekranową w aplikacji Flutter. Każde wywołanie push umieszcza nowy Route na szczycie stosu, pop usuwa górny Route i wraca do poprzedniego ekranu. MaterialApp automatycznie tworzy Navigator dla całej aplikacji, udostępniając go przez Navigator.of(context).

W przeciwieństwie do StatefulWidget, gdzie zmiana zawartości odbywa się przez setState wewnątrz jednego widgeta, Navigator operuje na całych ekranach z własnym cyklem życia. Każdy Route w stosie to izolowany stan z własnym BuildContext, co zapobiega wyciekom pamięci i upraszcza zarządzanie zależnościami. Przy wywołaniu pop nieużywany Route jest niszczony, zwalniając zasoby.

Według Flutter Navigation Guide (2026), Navigator przeszedł ewolucję od imperatywnego API (Navigator 1.0) do deklaratywnego (Navigator 2.0). Navigator 1.0 używa metod push/pop bezpośrednio, co jest wygodne w prostych scenariuszach. Navigator 2.0 (Router) nadaje się do aplikacji z głębokimi linkami, adaptacyjną nawigacją i routingiem webowym.

Jak Navigator działa pod maską

Wewnątrz Navigator używa Overlay — specjalnego widgeta, który wyświetla Route jeden nad drugim. Każdy Route tworzy własną pozycję w Overlay z indeksem Z odpowiadającym głębokości w stosie. To wyjaśnia, dlaczego przy push nowy ekran jest animowany nad poprzednim, a przy pop — poprzedni ekran jest już gotowy do wyświetlenia: nie został zniszczony, tylko pozostał w Overlay poniżej nowego.

Do animacji przejść Navigator używa PageTransitionsTheme, które można nadpisać w ThemeData. Animacje platformowe są ustawiane przez CupertinoPageRoute dla iOS (przesunięcie z prawej) i MaterialPageRoute dla Androida (przesunięcie z dołu). Navigator automatycznie wybiera właściwą animację przy użyciu PlatformRoute.

Navigator udostępnia zestaw metod do zarządzania stosem Route. Każda metoda rozwiązuje konkretne zadanie nawigacji — od prostego przejścia do całkowitej zamiany historii ekranów. Przyjrzyjmy się głównym metodom z przykładami użycia.

MetodaOpisScenariusz zastosowania
pushDodaje Route na szczyt stosuPrzejście na nowy ekran z możliwością powrotu
popUsuwa górny Route ze stosuPowrót do poprzedniego ekranu
pushReplacementZastępuje bieżący Route nowymPo logowaniu — ekran logowania zastępowany głównym
pushAndRemoveUntilDodaje Route i usuwa poprzednie do warunkuWyjście na ekran główny z czyszczeniem historii
popUntilUsuwa Route ze stosu do osiągnięcia warunkuPowrót do określonego ekranu w historii
maybePopWywołuje pop tylko jeśli stos zawiera >1 RouteZapobieganie zamknięciu aplikacji przy przypadkowym naciśnięciu

Push i Pop: podstawowe operacje

Metoda push przyjmuje Route i zwraca Future z wynikiem przekazanym przy pop. Umożliwia to odbieranie danych z ekranu, do którego przeszliśmy. Na przykład ekran wyboru daty może zwrócić DateTime przez Navigator.pop(context, selectedDate). Metoda pop bez argumentu zwraca null, z argumentem — przekazuje wartość do wywołującego ekranu.

PushReplacement: zamiana ekranu

pushReplacement zastępuje bieżącą Route nową, usuwając bieżącą ze stosu. Jest to kluczowe w scenariuszach, gdzie użytkownik nie powinien wracać do poprzedniego ekranu. Typowy przykład — ekran logowania: po pomyślnym zalogowaniu bieżący ekran jest zastępowany głównym, a przycisk „Wstecz” nie wraca do formularza logowania.

Nazwane trasy i onGenerateRoute

Navigator obsługuje nawigację po nazwanych trasach przez metodę pushNamed. Zamiast bezpośredniego tworzenia Route, programista podaje identyfikator tekstowy, a Navigator tworzy Route automatycznie na podstawie konfiguracji w MaterialApp. Upraszcza to kod i centralizuje definicję tras w jednym miejscu.

Nazwane trasy definiuje się przez właściwość routes w MaterialApp, gdzie każdy klucz to ścieżka tekstowa, a wartość to funkcja zwracająca Widget. Dla dynamicznych tras (z parametrami) używa się onGenerateRoute — callbacka, który otrzymuje RouteSettings i zwraca Route. Umożliwia to przekazywanie argumentów przez arguments i realizację głębokiej nawigacji.

Według Flutter Cookbook (2026), przekazywanie argumentów przez pushNamed odbywa się za pomocą parametru arguments: Object?. Ekran odbierający pobiera argumenty przez ModalRoute.of(context)!.settings.arguments, co zapewnia bezpieczne typowo przekazywanie danych bez globalnych zmiennych lub InheritedWidget.

Obsługa nieznanych tras

Właściwość onUnknownRoute w MaterialApp obsługuje przypadki, gdy pushNamed jest wywołany z nieistniejącą trasą. Jest to przydatne do wyświetlania ekranu 404 lub przekierowania na stronę główną. W połączeniu z onGenerateRoute zapewnia pełne pokrycie wszystkich możliwych scenariuszy nawigacyjnych.

Navigator 2.0 (znany również jako Router API) — to deklaratywne podejście do nawigacji, wprowadzone we Flutter 2.0. W przeciwieństwie do imperatywnego Navigator 1.0, gdzie programista wywołuje push/pop, Router zarządza nawigacją przez stan, automatycznie synchronizując URL przeglądarki z bieżącym ekranem. Jest to szczególnie ważne dla aplikacji webowych i wersji desktopowych.

Architektura Navigator 2.0 składa się z trzech kluczowych komponentów: RouteInformationParser parsuje URL do konfiguracji trasy, RouterDelegate przekształca konfigurację na listę Route, a BackButtonDispatcher obsługuje systemowy przycisk „Wstecz”. Taka architektura czyni nawigację w pełni przewidywalną i testowalną.

Dla uproszczenia pracy z Navigator 2.0 istnieją pakiety-opakowania: go_router (zalecany przez Google), auto_route i beamer. go_router udostępnia deklaratywny DSL do definiowania tras z obsługą nawigacji zagnieżdżonej, przekierowań i głębokich linków bez ręcznej implementacji RouterDelegate. Według pub.dev (2026), go_router jest używany w 35% nowych projektów Flutter preferujących podejście deklaratywne.

Przyjrzyjmy się przykładowi Navigator z nazwanymi trasami i przekazywaniem danych między ekranami. Kod demonstruje ekran listy produktów, przejście do ekranu szczegółów i powrót z wynikiem.

dart
// Konfiguracja tras w 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(),
    );
  },
)

// Nawigacja z przekazywaniem danych
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Pobieranie danych na ekranie odbierającym
final args = ModalRoute.of(context)!.settings.arguments as String;

// Zastąp ekran po logowaniu
Navigator.pushReplacementNamed(context, '/home');

// Wyczyść stos do ekranu głównego
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

W przykładzie Navigator.pushNamed przekazuje identyfikator produktu do ekranu szczegółów. Przy powrocie przez Navigator.pop(context, updatedProduct) wywołujący ekran otrzymuje zaktualizowane dane w zmiennej result. pushReplacementNamed zastępuje bieżący ekran po autoryzacji, a pushNamedAndRemoveUntil z warunkiem (route) => false całkowicie czyści stos, zapobiegając powrotowi do poprzednich ekranów.

Często zadawane pytania

Jaka jest różnica między Navigator 1.0 a Navigator 2.0?

Navigator 1.0 — imperatywne API z metodami push i pop, wygodne dla prostych aplikacji mobilnych. Navigator 2.0 — deklaratywne API przez Router, RouterDelegate i RouteInformationParser, niezbędne dla aplikacji webowych z routingiem URL, głębokimi linkami i adaptacyjną nawigacją. W praktycznych projektach zaleca się go_router jako uproszczoną nakładkę na Navigator 2.0.

Jak przekazać dane między ekranami przez Navigator?

Dane są przekazywane przez argument arguments w pushNamed lub bezpośrednio przez konstruktor Route. Na ekranie odbierającym dane są pobierane przez ModalRoute.of(context)!.settings.arguments. Do zwrócenia danych użyj Navigator.pop(context, result) — wywołujący ekran otrzyma wynik jako wartość Future zwróconej z push.

Dlaczego przycisk „Wstecz” nie wraca do poprzedniego ekranu?

Dzieje się tak, jeśli bieżący ekran został otwarty przez pushReplacement, który usuwa poprzednią Route ze stosu. W tym przypadku nie ma historii nawigacji, a przycisk „Wstecz” zamyka aplikację. Aby wrócić, użyj zwykłego push, a nie pushReplacement. Sprawdź również, czy wywołanie Navigator.pop jest poprawnie obsługiwane na bieżącym ekranie.

Jak zapobiec powrotowi do poprzedniego ekranu?

Użyj pushReplacement do zastąpienia bieżącego ekranu nowym — poprzedni ekran jest usuwany ze stosu i nie można do niego wrócić. Do całkowitego czyszczenia historii użyj pushAndRemoveUntil z warunkiem (route) => false. Alternatywnie można nadpisać WillPopScope (przestarzałe) lub PopScope do przechwytywania systemowego przycisku „Wstecz”.

Czym jest go_router i kiedy go używać?

go_router — to deklaratywny pakiet nawigacji od Google, zbudowany na Navigator 2.0. Udostępnia prosty DSL do definiowania tras z obsługą zagnieżdżenia, przekierowań, głębokich linków i ShellRoute dla BottomNavigationBar. Używaj go_router w nowych projektach, szczególnie jeśli wymagane jest wsparcie webowe lub złożone wzorce nawigacji z zabezpieczonymi trasami.

Podsumowanie

  • Navigator — menedżer nawigacji Flutter, zarządzający stosem Route z metodami push, pop, pushReplacement i pushAndRemoveUntil
  • Stos LIFO — każdy push dodaje Route na szczyt, pop usuwa górny; stos przechowuje historię przejść według zasady „ostatni wchodzi, pierwszy wychodzi”
  • pushReplacement — zamiana bieżącego ekranu bez możliwości powrotu, kluczowe w scenariuszach logowania i onboardingu
  • Nazwane trasy — pushNamed z RouteSettings i onGenerateRoute do scentralizowanego definiowania tras z przekazywaniem argumentów
  • Navigator 2.0 — deklaratywna nawigacja przez Router, RouterDelegate i RouteInformationParser dla głębokich linków webowych
  • go_router — zalecana przez Google nakładka na Navigator 2.0 z prostym DSL i obsługą ShellRoute
  • Przekazywanie danych — przez arguments w pushNamed i zwracanie wyniku przez Future z push za pomocą Navigator.pop(context, value)

Opracujemy aplikację mobilną pod klucz

IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.

Omów projekt

Przeczytaj również