Navigator: gestionarea ecranelor în Flutter

Autor: IT Sectr Publicat: 2026-07-02 Timp de citire: 9 min

Navigator — este un widget-manager de navigație în Flutter care gestionează stiva de rute (Route) pentru deplasarea între ecrane prin metodele push, pop, pushReplacement și pushNamed. Spre deosebire de înlocuirea directă a widgeturilor prin State, Navigator funcționează la nivelul ecranelor întregi: păstrează istoricul tranzițiilor și suportă animații specifice platformei. Conform Flutter API Reference (2026), Navigator 2.0 (Router) oferă gestionare declarativă a navigației pentru scenarii complexe cu linkuri profunde și design adaptiv. într-o aplicație tipică, Navigator asigură comportamentul corect al butonului „Înapoi” pe Android și al gesturilor de glisare pe iOS.

Principalele

  • Navigator — manager de navigație care gestionează stiva de rute prin metodele push, pop, pushNamed, pushReplacement și pushAndRemoveUntil
  • Stiva de rute — Navigator stochează ecranele într-o stivă LIFO: fiecare push adaugă un ecran deasupra, pop înlătură cel de sus
  • pushNamed — navigație pe rute denumite definite în MaterialApp.routes sau onGenerateRoute
  • pushReplacement — înlocuirea ecranului curent cu unul nou fără posibilitatea de a reveni la cel anterior (de exemplu, după autentificare)
  • Navigator 2.0 — API declarativ cu Router, RouterDelegate și RouteInformationParser pentru navigație web și desktop

Ce este Navigator în Flutter

Navigator — este un widget care gestionează stiva de obiecte Route și implementează navigația pe ecrane în aplicația Flutter. Fiecare apel push plasează un nou Route în vârful stivei, pop înlătură Route-ul de sus și revine la ecranul anterior. MaterialApp creează automat un Navigator pentru întreaga aplicație, făcându-l accesibil prin Navigator.of(context).

Spre deosebire de StatefulWidget, unde înlocuirea conținutului are loc prin setState în interiorul unui singur widget, Navigator operează pe ecrane întregi cu propriul ciclu de viață. Fiecare Route din stivă este o stare izolată cu propriul BuildContext, ceea ce previne scurgerile de memorie și simplifică gestionarea dependențelor. La apelul pop, Route-ul neutilizat este distrus, eliberând resurse.

Conform Flutter Navigation Guide (2026), Navigator a evoluat de la API imperativ (Navigator 1.0) la API declarativ (Navigator 2.0). Navigator 1.0 folosește metodele push/pop direct, ceea ce este convenabil pentru scenarii simple. Navigator 2.0 (Router) este potrivit pentru aplicații cu linkuri profunde, navigație adaptivă și rutare web.

Cum funcționează Navigator în interior

În interior, Navigator folosește Overlay — un widget special care afișează Route-urile unul peste altul. Fiecare Route își creează propria poziție în Overlay cu un indice Z corespunzător adâncimii în stivă. Aceasta explică de ce la push noul ecran este animat deasupra celui anterior, iar la pop — ecranul anterior este deja gata de afișare: nu a fost distrus, ci a rămas în Overlay sub cel nou.

Pentru animații de tranziție, Navigator folosește PageTransitionsTheme, care poate fi suprascris în ThemeData. Animațiile specifice platformei sunt setate prin CupertinoPageRoute pentru iOS (glisare din dreapta) și MaterialPageRoute pentru Android (glisare de jos). Navigator selectează automat animația corectă atunci când folosește PlatformRoute.

Navigator oferă un set de metode pentru gestionarea stivei Route. Fiecare metodă rezolvă o sarcină specifică de navigație — de la o simplă tranziție până la înlocuirea completă a istoricului ecranelor. Să analizăm principalele metode cu exemple de utilizare.

MetodăDescriereScenariu de aplicare
pushAdaugă Route în vârful stiveiTranziție pe un ecran nou cu posibilitate de revenire
popÎnlătură Route-ul de sus din stivăRevenire la ecranul anterior
pushReplacementÎnlocuiește Route-ul curent cu unul nouDupă autentificare — ecranul de logare este înlocuit cu cel principal
pushAndRemoveUntilAdaugă Route și înlătură precedentele până la o condițieIeșire la ecranul principal cu curățarea istoricului
popUntilÎnlătură Route-uri din stivă până la îndeplinirea unei condițiiRevenire la un ecran specific din istoric
maybePopApelează pop doar dacă stiva conține >1 RoutePrevenirea închiderii aplicației la apăsarea accidentală

Push și Pop: operații de bază

Metoda push primește un Route și returnează un Future cu rezultatul transmis la pop. Aceasta permite primirea datelor de pe ecranul pe care am navigat. De exemplu, un ecran de selectare a datei poate returna DateTime prin Navigator.pop(context, selectedDate). Metoda pop fără argument returnează null, iar cu argument — transmite valoarea ecranului apelant.

PushReplacement: înlocuirea ecranului

pushReplacement înlocuiește Route-ul curent cu unul nou, eliminându-l pe cel curent din stivă. Acest lucru este esențial în scenariile în care utilizatorul nu ar trebui să revină la ecranul anterior. Un exemplu tipic — ecranul de autentificare: după conectarea cu succes, ecranul curent este înlocuit cu cel principal, iar butonul „Înapoi” nu revine la formularul de autentificare.

Rute denumite și onGenerateRoute

Navigator suportă navigația pe rute denumite prin metoda pushNamed. În loc să creeze Direct un Route, dezvoltatorul specifică un identificator text, iar Navigator creează automat Route-ul pe baza configurației din MaterialApp. Aceasta simplifică codul și centralizează definirea rutelor într-un singur loc.

Rutele denumite se definesc prin proprietatea routes din MaterialApp, unde fiecare cheie este o cale text, iar valoarea este o funcție care returnează un Widget. Pentru rute dinamice (cu parametri) se folosește onGenerateRoute — un callback care primește RouteSettings și returnează un Route. Aceasta permite transmiterea argumentelor prin arguments și implementarea navigației profunde.

Conform Flutter Cookbook (2026), transmiterea argumentelor prin pushNamed se realizează cu parametrul arguments: Object?. Ecranul receptor extrage argumentele prin ModalRoute.of(context)!.settings.arguments, ceea ce asigură o transmitere sigură a datelor fără variabile globale sau InheritedWidget.

Gestionarea rutelor necunoscute

Proprietatea onUnknownRoute din MaterialApp gestionează cazurile când pushNamed este apelat cu o rută inexistentă. Acest lucru este util pentru afișarea unui ecran 404 sau redirecționarea către pagina principală. În combinație cu onGenerateRoute, asigură o acoperire completă a tuturor scenariilor posibile de navigație.

Navigator 2.0 (cunoscut și ca Router API) — este o abordare declarativă a navigației, introdusă în Flutter 2.0. Spre deosebire de Navigator 1.0 imperativ, unde dezvoltatorul apelează push/pop, Router gestionează navigația prin stare, sincronizând automat URL-ul browserului cu ecranul curent. Acest lucru este deosebit de important pentru aplicații web și versiuni desktop.

Arhitectura Navigator 2.0 constă din trei componente cheie: RouteInformationParser parsează URL-ul într-o configurație de rută, RouterDelegate transformă configurația într-o listă de Route-uri, iar BackButtonDispatcher gestionează butonul de sistem „Înapoi”. O astfel de arhitectură face navigația complet predictibilă și testabilă.

Pentru simplificarea lucrului cu Navigator 2.0 există pachete wrapper: go_router (recomandat de Google), auto_route și beamer. go_router oferă un DSL declarativ pentru definirea rutelor cu suport pentru navigație imbricată, redirecționări și linkuri profunde fără implementarea manuală a RouterDelegate. Conform pub.dev (2026), go_router este folosit în 35% din noile proiecte Flutter care preferă abordarea declarativă.

Să analizăm un exemplu Navigator cu rute denumite și transmitere de date între ecrane. Codul demonstrează un ecran de listă de produse, tranziția la ecranul de detalii și revenirea cu rezultat.

dart
// Configurarea rutelor în 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(),
    );
  },
)

// Navigație cu transmitere de date
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Obținerea datelor pe ecranul receptor
final args = ModalRoute.of(context)!.settings.arguments as String;

// Înlocuiește ecranul după autentificare
Navigator.pushReplacementNamed(context, '/home');

// Curăță stiva până la ecranul principal
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

În exemplu, Navigator.pushNamed transmite identificatorul produsului către ecranul de detalii. La revenirea prin Navigator.pop(context, updatedProduct), ecranul apelant primește datele actualizate în variabila result. pushReplacementNamed înlocuiește ecranul curent după autorizare, iar pushNamedAndRemoveUntil cu condiția (route) => false curăță complet stiva, prevenind revenirea la ecranele anterioare.

întrebări frecvente

Care este diferența între Navigator 1.0 și Navigator 2.0?

Navigator 1.0 — API imperativ cu metodele push și pop, convenabil pentru aplicații mobile simple. Navigator 2.0 — API declarativ prin Router, RouterDelegate și RouteInformationParser, necesar pentru aplicații web cu rutare URL, linkuri profunde și navigație adaptivă. Pentru proiecte practice, se recomandă go_router ca wrapper simplificat peste Navigator 2.0.

Cum se transmit datele între ecrane prin Navigator?

Datele se transmit prin argumentul arguments în pushNamed sau direct prin constructorul Route. Pe ecranul receptor, datele se extrag prin ModalRoute.of(context)!.settings.arguments. Pentru returnarea datelor, folosiți Navigator.pop(context, result) — ecranul apelant va primi rezultatul ca valoare Future returnată de push.

De ce butonul „Înapoi” nu revine la ecranul anterior?

Acest lucru se înâmplă dacă ecranul curent a fost deschis prin pushReplacement, care înlătură Route-ul anterior din stivă. În acest caz, nu există istoric de navigație, iar butonul „Înapoi” închide aplicația. Pentru a reveni, folosiți push obișnuit, nu pushReplacement. Verificați, de asemenea, că apelul Navigator.pop este gestionat corect pe ecranul curent.

Cum se previne revenirea la ecranul anterior?

Folosiți pushReplacement pentru a înlocui ecranul curent cu unul nou — ecranul anterior este eliminat din stivă și nu se poate reveni la el. Pentru curățarea completă a istoricului, folosiți pushAndRemoveUntil cu condiția (route) => false. Alternativ, puteți suprascrie WillPopScope (învechit) sau PopScope pentru a intercepta butonul de sistem „Înapoi”.

Ce este go_router și când să îl folosim?

go_router — este un pachet de navigație declarativ de la Google, construit pe Navigator 2.0. Oferă un DSL simplu pentru definirea rutelor cu suport pentru imbricare, redirecționări, linkuri profunde și ShellRoute pentru BottomNavigationBar. Folosiți go_router în proiecte noi, mai ales dacă este necesar suport web sau modele complexe de navigație cu rute protejate.

Rezumat

  • Navigator — manager de navigație Flutter, care gestionează stiva Route cu metodele push, pop, pushReplacement și pushAndRemoveUntil
  • Stivă LIFO — fiecare push adaugă un Route în vârf, pop înlătură vârful; stiva păstrează istoricul tranzițiilor după principiul „ultimul intrat, primul ieșit”
  • pushReplacement — înlocuirea ecranului curent fără posibilitate de revenire, esențial pentru scenariile de autentificare și onboarding
  • Rute denumite — pushNamed cu RouteSettings și onGenerateRoute pentru definirea centralizată a rutelor cu transmitere de argumente
  • Navigator 2.0 — navigație declarativă prin Router, RouterDelegate și RouteInformationParser pentru linkuri profunde web
  • go_router — wrapper recomandat de Google peste Navigator 2.0 cu DSL simplu și suport ShellRoute
  • Transmiterea datelor — prin arguments în pushNamed și returnarea rezultatului prin Future de la push cu Navigator.pop(context, value)

Vom dezvolta o aplicație mobilă la cheie

IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.

Discutați proiectul

Citiți și