Navigator: cos'è, gestione degli schermi in Flutter

Autore: IT Sectr Pubblicato: 2026-07-02 Tempo di lettura: 9 min

Navigator è un widget gestore di navigazione in Flutter che gestisce una pila di oggetti Route per spostarsi tra schermate tramite i metodi push, pop, pushReplacement e pushNamed. A differenza della sostituzione diretta di widget tramite State, Navigator opera a livello di schermate intere: memorizza la cronologia delle transizioni e supporta animazioni specifiche della piattaforma. Secondo il Riferimento API Flutter (2026), Navigator 2.0 (Router) fornisce una gestione della navigazione dichiarativa per scenari complessi con collegamenti profondi e design adattivo. In un'applicazione tipica, Navigator garantisce il comportamento corretto del pulsante Indietro su Android e dei gesti di scorrimento su iOS.

Punti chiave

  • Navigator — un gestore di navigazione che controlla una pila di route tramite i metodi push, pop, pushNamed, pushReplacement e pushAndRemoveUntil
  • Pila di route — Navigator memorizza le schermate in una pila LIFO: ogni push aggiunge una schermata in cima, pop rimuove quella superiore
  • pushNamed — navigazione per route nominate definite in MaterialApp.routes o onGenerateRoute
  • pushReplacement — sostituisce la schermata corrente con una nuova senza possibilità di tornare indietro (ad esempio, dopo il login)
  • Navigator 2.0 — API dichiarativa con Router, RouterDelegate e RouteInformationParser per la navigazione web e desktop

Cos'è Navigator in Flutter

Navigator è un widget che gestisce una pila di oggetti Route, implementando la navigazione tra schermate in un'applicazione Flutter. Ogni chiamata a push inserisce un nuovo Route in cima alla pila, pop rimuove il Route superiore e torna alla schermata precedente. MaterialApp crea automaticamente un Navigator per l'intera applicazione, rendendolo accessibile tramite Navigator.of(context).

A differenza di StatefulWidget, dove la sostituzione del contenuto avviene tramite setState all'interno di un singolo widget, Navigator opera con schermate complete che hanno un proprio ciclo di vita. Ogni Route nella pila è uno stato isolato con il proprio BuildContext, prevenendo perdite di memoria e semplificando la gestione delle dipendenze. Quando viene chiamato pop, il Route inutilizzato viene distrutto, liberando risorse.

Secondo la Guida alla navigazione Flutter (2026), Navigator si è evoluto da un'API imperativa (Navigator 1.0) a una dichiarativa (Navigator 2.0). Navigator 1.0 utilizza i metodi push/pop direttamente, il che è conveniente per scenari semplici. Navigator 2.0 (Router) è adatto per applicazioni con collegamenti profondi, navigazione adattiva e routing web.

Come funziona Navigator internamente

Internamente, Navigator utilizza Overlay — un widget speciale che visualizza i Routes uno sopra l'altro. Ogni Route crea la propria posizione nell'Overlay con un indice z corrispondente alla sua profondità nella pila. Questo spiega perché quando si chiama push, la nuova schermata si anima sopra quella precedente, e quando si chiama pop, la schermata precedente è già pronta per la visualizzazione: non è stata distrutta ma è rimasta nell'Overlay sotto la nuova schermata.

Per le animazioni di transizione, Navigator utilizza PageTransitionsTheme, che può essere sovrascritto in ThemeData. Le animazioni specifiche della piattaforma vengono impostate tramite CupertinoPageRoute per iOS (scorrimento da destra) e MaterialPageRoute per Android (scorrimento dal basso). Navigator seleziona automaticamente l'animazione corretta quando si utilizza PlatformRoute.

Navigator fornisce un insieme di metodi per gestire la pila di Routes. Ogni metodo risolve un compito di navigazione specifico — da una semplice transizione alla sostituzione completa della cronologia delle schermate. Esaminiamo i metodi principali con esempi di utilizzo.

MetodoDescrizioneCaso d'uso
pushAggiunge un Route in cima alla pilaNavigare verso una nuova schermata con possibilità di ritorno
popRimuove il Route superiore dalla pilaTornare alla schermata precedente
pushReplacementSostituisce il Route corrente con uno nuovoDopo il login — la schermata di login viene sostituita dalla schermata principale
pushAndRemoveUntilAggiunge un Route e rimuove i precedenti fino a una condizioneAndare alla schermata principale pulendo la cronologia
popUntilRimuove Routes dalla pila fino al raggiungimento di una condizioneTornare a una schermata specifica nella cronologia
maybePopChiama pop solo se la pila contiene >1 RouteImpedire la chiusura dell'app alla pressione accidentale di Indietro

Push e Pop: operazioni di base

Il metodo push prende un Route e restituisce un Future con il risultato passato durante pop. Ciò consente di ricevere dati dalla schermata verso cui si è navigato. Ad esempio, una schermata di selezione data può restituire un DateTime tramite Navigator.pop(context, selectedDate). Il metodo pop senza argomenti restituisce null, con un argomento — passa il valore alla schermata chiamante.

PushReplacement: sostituzione della schermata

pushReplacement sostituisce il Route corrente con uno nuovo, rimuovendo il route corrente dalla pila. Questo è fondamentale per scenari in cui l'utente non deve poter tornare alla schermata precedente. Un esempio tipico — la schermata di login: dopo il login riuscito, la schermata corrente viene sostituita dalla schermata principale e il pulsante Indietro non torna al modulo di login.

Route nominate e onGenerateRoute

Navigator supporta la navigazione per route nominate tramite il metodo pushNamed. Invece di creare un Route direttamente, lo sviluppatore specifica un identificatore di stringa e Navigator crea automaticamente il Route in base alla configurazione in MaterialApp. Questo semplifica il codice e centralizza la definizione delle route in un unico punto.

Le route nominate vengono definite tramite la proprietà routes in MaterialApp, dove ogni chiave è una stringa di percorso e il valore è una funzione che restituisce un Widget. Per route dinamiche (con parametri), si utilizza onGenerateRoute — un callback che riceve RouteSettings e restituisce un Route. Ciò consente di passare argomenti tramite il parametro arguments e implementare la navigazione profonda.

Secondo il Flutter Cookbook (2026), il passaggio di argomenti tramite pushNamed viene effettuato con il parametro arguments: Object?. La schermata ricevente estrae gli argomenti tramite ModalRoute.of(context)!.settings.arguments, fornendo un trasferimento dati type-safe senza variabili globali o InheritedWidget.

Gestione delle route sconosciute

La proprietà onUnknownRoute in MaterialApp gestisce i casi in cui pushNamed viene chiamato con una route inesistente. Questo è utile per mostrare una schermata 404 o reindirizzare alla pagina principale. In combinazione con onGenerateRoute, garantisce una copertura completa di tutti i possibili scenari di navigazione.

Navigator 2.0 (noto anche come API Router) è un approccio dichiarativo alla navigazione introdotto in Flutter 2.0. A differenza del Navigator 1.0 imperativo, dove lo sviluppatore chiama push/pop, Router gestisce la navigazione tramite lo stato, sincronizzando automaticamente l'URL del browser con la schermata corrente. Questo è particolarmente importante per applicazioni web e versioni desktop.

L'architettura di Navigator 2.0 è composta da tre componenti chiave: RouteInformationParser analizza l'URL in una configurazione di route, RouterDelegate trasforma la configurazione in un elenco di Routes e BackButtonDispatcher gestisce il pulsante Indietro di sistema. Questa architettura rende la navigazione completamente prevedibile e testabile.

Per semplificare il lavoro con Navigator 2.0, esistono pacchetti wrapper: go_router (raccomandato da Google), auto_route e beamer. go_router fornisce un DSL dichiarativo per definire route con supporto per navigazione annidata, reindirizzamenti e collegamenti profondi senza implementare manualmente RouterDelegate. Secondo pub.dev (2026), go_router è utilizzato nel 35% dei nuovi progetti Flutter che preferiscono un approccio dichiarativo.

Consideriamo un esempio di Navigator con route nominate e passaggio di dati tra schermate. Il codice mostra una schermata di elenco prodotti, la transizione verso una schermata di dettaglio e il ritorno con un risultato.

dart
// Route configuration in 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(),
    );
  },
)

// Navigation with data passing
final result = await Navigator.pushNamed(
  context,
  '/product',
  arguments: 'product_42',
);

// Getting data on the receiving screen
final args = ModalRoute.of(context)!.settings.arguments as String;

// Replace screen after login
Navigator.pushReplacementNamed(context, '/home');

// Clear stack to main screen
Navigator.pushNamedAndRemoveUntil(
  context,
  '/home',
  (route) => false,
);

Nell'esempio, Navigator.pushNamed passa l'ID del prodotto alla schermata di dettaglio. Al ritorno tramite Navigator.pop(context, updatedProduct), la schermata chiamante riceve i dati aggiornati nella variabile result. pushReplacementNamed sostituisce la schermata corrente dopo l'autorizzazione, e pushNamedAndRemoveUntil con la condizione (route) => false pulisce completamente la pila, impedendo la navigazione di ritorno verso schermate precedenti.

Domande frequenti

Qual è la differenza tra Navigator 1.0 e Navigator 2.0?

Navigator 1.0 — un'API imperativa con metodi push e pop, conveniente per applicazioni mobili semplici. Navigator 2.0 — un'API dichiarativa tramite Router, RouterDelegate e RouteInformationParser, necessaria per applicazioni web con routing URL, collegamenti profondi e navigazione adattiva. Per progetti pratici, si raccomanda go_router come wrapper semplificato su Navigator 2.0.

Come passare dati tra schermate tramite Navigator?

I dati vengono passati tramite il parametro arguments in pushNamed o direttamente tramite il costruttore di Route. Sulla schermata ricevente, i dati vengono estratti tramite ModalRoute.of(context)!.settings.arguments. Per restituire dati, utilizzare Navigator.pop(context, result) — la schermata chiamante riceverà il risultato come valore Future restituito da push.

Perché il pulsante Indietro non torna alla schermata precedente?

Ciò accade se la schermata corrente è stata aperta tramite pushReplacement, che rimuove il Route precedente dalla pila. In questo caso, non c'è cronologia di navigazione e il pulsante Indietro chiude l'applicazione. Per tornare indietro, utilizzare push normale invece di pushReplacement. Verificare anche che la chiamata Navigator.pop sia gestita correttamente sulla schermata corrente.

Come impedire il ritorno alla schermata precedente?

Utilizzare pushReplacement per sostituire la schermata corrente con una nuova — la schermata precedente viene rimossa dalla pila e non è possibile tornarci. Per la pulizia completa della cronologia, utilizzare pushAndRemoveUntil con la condizione (route) => false. In alternativa, è possibile sovrascrivere WillPopScope (deprecato) o PopScope per intercettare il pulsante Indietro di sistema.

Cos'è go_router e quando usarlo?

go_router è un pacchetto di navigazione dichiarativa di Google costruito su Navigator 2.0. Fornisce un DSL semplice per definire route con supporto per annidamento, reindirizzamenti, collegamenti profondi e ShellRoute per BottomNavigationBar. Utilizzare go_router per nuovi progetti, specialmente se è richiesto supporto web o pattern di navigazione complessi con route protette.

Riepilogo

  • Navigator — gestore di navigazione Flutter che controlla la pila di Routes con i metodi push, pop, pushReplacement e pushAndRemoveUntil
  • Pila LIFO — ogni push aggiunge un Route in cima, pop rimuove quello superiore; la pila memorizza la cronologia delle transizioni secondo il principio last-in-first-out
  • pushReplacement — sostituisce la schermata corrente senza possibilità di ritorno, fondamentale per scenari di login e onboarding
  • Route nominate — pushNamed con RouteSettings e onGenerateRoute per definizione centralizzata delle route con passaggio di argomenti
  • Navigator 2.0 — navigazione dichiarativa tramite Router, RouterDelegate e RouteInformationParser per collegamenti profondi web
  • go_router — wrapper raccomandato da Google su Navigator 2.0 con DSL semplice e supporto ShellRoute
  • Passaggio dati — tramite arguments in pushNamed e restituzione del risultato tramite Future da push usando Navigator.pop(context, value)

Svilupperemo un'applicazione mobile chiavi in mano

IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.

Discuti il progetto

Leggi anche