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 — 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.
Î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ă | Descriere | Scenariu de aplicare |
|---|---|---|
| push | Adaugă Route în vârful stivei | Tranziț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 nou | După autentificare — ecranul de logare este înlocuit cu cel principal |
| pushAndRemoveUntil | Adaugă Route și înlătură precedentele până la o condiție | Ieșire la ecranul principal cu curățarea istoricului |
| popUntil | Înlătură Route-uri din stivă până la îndeplinirea unei condiții | Revenire la un ecran specific din istoric |
| maybePop | Apelează pop doar dacă stiva conține >1 Route | Prevenirea închiderii aplicației la apăsarea accidentală |
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 î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.
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.
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.
// 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
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.
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.
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.
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”.
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
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.
Citiți și