Navigator: qué es, gestión de pantallas en Flutter

Autor: IT Sectr Publicado: 2026-07-02 Tiempo de lectura: 9 min

Navigator es un widget gestor de navegación en Flutter que maneja una pila de objetos Route para moverse entre pantallas mediante los métodos push, pop, pushReplacement y pushNamed. A diferencia de la sustitución directa de widgets mediante State, Navigator trabaja a nivel de pantallas completas: almacena el historial de transiciones y admite animaciones específicas de la plataforma. Según la Referencia de la API de Flutter (2026), Navigator 2.0 (Router) proporciona una gestión de navegación declarativa para escenarios complejos con enlaces profundos y diseño adaptable. En una aplicación típica, Navigator garantiza el comportamiento correcto del botón Atrás en Android y los gestos de deslizamiento en iOS.

Puntos clave

  • Navigator — gestor de navegación que controla una pila de rutas mediante los métodos push, pop, pushNamed, pushReplacement y pushAndRemoveUntil
  • Pila de rutas — Navigator almacena las pantallas en una pila LIFO: cada push añade una pantalla arriba, pop elimina la superior
  • pushNamed — navegación por rutas nombradas definidas en MaterialApp.routes o onGenerateRoute
  • pushReplacement — reemplaza la pantalla actual por una nueva sin posibilidad de volver atrás (por ejemplo, después del inicio de sesión)
  • Navigator 2.0 — API declarativa con Router, RouterDelegate y RouteInformationParser para navegación web y de escritorio

Qué es Navigator en Flutter

Navigator es un widget que gestiona una pila de objetos Route, implementando la navegación entre pantallas en una aplicación Flutter. Cada llamada a push coloca un nuevo Route en la cima de la pila, pop elimina el Route superior y regresa a la pantalla anterior. MaterialApp crea automáticamente un Navigator para toda la aplicación, haciéndolo accesible mediante Navigator.of(context).

A diferencia de StatefulWidget, donde la sustitución de contenido ocurre mediante setState dentro de un solo widget, Navigator opera con pantallas completas que tienen su propio ciclo de vida. Cada Route en la pila es un estado aislado con su propio BuildContext, lo que evita fugas de memoria y simplifica la gestión de dependencias. Cuando se llama a pop, el Route no utilizado se destruye, liberando recursos.

Según la Guía de navegación de Flutter (2026), Navigator ha evolucionado desde una API imperativa (Navigator 1.0) hasta una declarativa (Navigator 2.0). Navigator 1.0 utiliza métodos push/pop directamente, lo que es conveniente para escenarios simples. Navigator 2.0 (Router) es adecuado para aplicaciones con enlaces profundos, navegación adaptable y enrutamiento web.

Cómo funciona Navigator internamente

Internamente, Navigator utiliza Overlay, un widget especial que muestra los Routes uno sobre otro. Cada Route crea su propia posición en el Overlay con un z-index correspondiente a su profundidad en la pila. Esto explica por qué al llamar a push, la nueva pantalla se anima sobre la anterior, y al llamar a pop, la pantalla anterior ya está lista para mostrarse: no fue destruida sino que permaneció en el Overlay debajo de la nueva.

Para las animaciones de transición, Navigator utiliza PageTransitionsTheme, que se puede sobrescribir en ThemeData. Las animaciones específicas de la plataforma se configuran mediante CupertinoPageRoute para iOS (deslizar desde la derecha) y MaterialPageRoute para Android (deslizar desde abajo). Navigator selecciona automáticamente la animación correcta al usar PlatformRoute.

Navigator proporciona un conjunto de métodos para gestionar la pila de Routes. Cada método resuelve una tarea de navegación específica, desde una transición simple hasta el reemplazo completo del historial de pantallas. Revisemos los métodos principales con ejemplos de uso.

MétodoDescripciónCaso de uso
pushAñade un Route a la cima de la pilaNavegar a una nueva pantalla con posibilidad de volver
popElimina el Route superior de la pilaVolver a la pantalla anterior
pushReplacementReemplaza el Route actual por uno nuevoDespués del inicio de sesión — la pantalla de inicio se reemplaza por la principal
pushAndRemoveUntilAñade un Route y elimina los anteriores hasta cumplir una condiciónIr a la pantalla principal limpiando el historial
popUntilElimina Routes de la pila hasta cumplir una condiciónVolver a una pantalla específica en el historial
maybePopLlama a pop solo si la pila contiene >1 RouteEvitar el cierre de la aplicación al presionar Atrás accidentalmente

Push y Pop: operaciones básicas

El método push toma un Route y devuelve un Future con el resultado pasado durante pop. Esto permite recibir datos desde la pantalla a la que se navegó. Por ejemplo, una pantalla de selección de fecha puede devolver un DateTime mediante Navigator.pop(context, selectedDate). El método pop sin argumentos devuelve null, con un argumento — pasa el valor a la pantalla que llama.

PushReplacement: reemplazo de pantalla

pushReplacement reemplaza el Route actual por uno nuevo, eliminando el route actual de la pila. Esto es crítico para escenarios donde el usuario no debe poder volver a la pantalla anterior. Un ejemplo típico es la pantalla de inicio de sesión: después de un inicio exitoso, la pantalla actual se reemplaza por la principal, y el botón Atrás no regresa al formulario de inicio de sesión.

Rutas nombradas y onGenerateRoute

Navigator admite la navegación por rutas nombradas mediante el método pushNamed. En lugar de crear un Route directamente, el desarrollador especifica un identificador de cadena, y Navigator crea el Route automáticamente según la configuración en MaterialApp. Esto simplifica el código y centraliza la definición de rutas en un solo lugar.

Las rutas nombradas se definen mediante la propiedad routes en MaterialApp, donde cada clave es una cadena de ruta y el valor es una función que devuelve un Widget. Para rutas dinámicas (con parámetros), se utiliza onGenerateRoute, un callback que recibe RouteSettings y devuelve un Route. Esto permite pasar argumentos mediante el parámetro arguments e implementar navegación profunda.

Según el Cookbook de Flutter (2026), el paso de argumentos mediante pushNamed se realiza con el parámetro arguments: Object?. La pantalla receptora extrae los argumentos mediante ModalRoute.of(context)!.settings.arguments, proporcionando una transferencia de datos con seguridad de tipos sin variables globales ni InheritedWidget.

Manejo de rutas desconocidas

La propiedad onUnknownRoute en MaterialApp maneja los casos en que se llama a pushNamed con una ruta inexistente. Esto es útil para mostrar una pantalla 404 o redirigir a la página principal. En combinación con onGenerateRoute, garantiza una cobertura completa de todos los escenarios de navegación posibles.

Navigator 2.0 (también conocido como API Router) es un enfoque declarativo de navegación introducido en Flutter 2.0. A diferencia del Navigator 1.0 imperativo, donde el desarrollador llama a push/pop, Router gestiona la navegación mediante el estado, sincronizando automáticamente la URL del navegador con la pantalla actual. Esto es especialmente importante para aplicaciones web y versiones de escritorio.

La arquitectura de Navigator 2.0 consta de tres componentes clave: RouteInformationParser analiza la URL en una configuración de ruta, RouterDelegate transforma la configuración en una lista de Routes, y BackButtonDispatcher maneja el botón Atrás del sistema. Esta arquitectura hace que la navegación sea completamente predecible y comprobable.

Para simplificar el trabajo con Navigator 2.0, existen paquetes envoltorio: go_router (recomendado por Google), auto_route y beamer. go_router proporciona un DSL declarativo para definir rutas con soporte para navegación anidada, redirecciones y enlaces profundos sin implementar manualmente RouterDelegate. Según pub.dev (2026), go_router se utiliza en el 35% de los nuevos proyectos Flutter que prefieren un enfoque declarativo.

Consideremos un ejemplo de Navigator con rutas nombradas y paso de datos entre pantallas. El código demuestra una pantalla de lista de productos, la transición a una pantalla de detalle y el retorno con un resultado.

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,
);

En el ejemplo, Navigator.pushNamed pasa el ID del producto a la pantalla de detalle. Al regresar mediante Navigator.pop(context, updatedProduct), la pantalla que llama recibe los datos actualizados en la variable result. pushReplacementNamed reemplaza la pantalla actual después de la autorización, y pushNamedAndRemoveUntil con la condición (route) => false limpia completamente la pila, evitando la navegación de regreso a pantallas anteriores.

Preguntas frecuentes

¿Cuál es la diferencia entre Navigator 1.0 y Navigator 2.0?

Navigator 1.0 — una API imperativa con métodos push y pop, conveniente para aplicaciones móviles simples. Navigator 2.0 — una API declarativa mediante Router, RouterDelegate y RouteInformationParser, necesaria para aplicaciones web con enrutamiento URL, enlaces profundos y navegación adaptable. Para proyectos prácticos, se recomienda go_router como envoltorio simplificado sobre Navigator 2.0.

¿Cómo pasar datos entre pantallas mediante Navigator?

Los datos se pasan mediante el parámetro arguments en pushNamed o directamente a través del constructor de Route. En la pantalla receptora, los datos se recuperan mediante ModalRoute.of(context)!.settings.arguments. Para devolver datos, use Navigator.pop(context, result) — la pantalla que llama recibirá el resultado como un valor Future devuelto por push.

¿Por qué el botón Atrás no regresa a la pantalla anterior?

Esto ocurre si la pantalla actual se abrió mediante pushReplacement, que elimina el Route anterior de la pila. En este caso, no hay historial de navegación y el botón Atrás cierra la aplicación. Para regresar, use push normal en lugar de pushReplacement. Verifique también que la llamada a Navigator.pop se maneje correctamente en la pantalla actual.

¿Cómo evitar volver a la pantalla anterior?

Use pushReplacement para reemplazar la pantalla actual por una nueva — la pantalla anterior se elimina de la pila y no se puede regresar a ella. Para una limpieza completa del historial, use pushAndRemoveUntil con la condición (route) => false. Alternativamente, puede sobrescribir WillPopScope (obsoleto) o PopScope para interceptar el botón Atrás del sistema.

¿Qué es go_router y cuándo usarlo?

go_router es un paquete de navegación declarativa de Google construido sobre Navigator 2.0. Proporciona un DSL simple para definir rutas con soporte para anidamiento, redirecciones, enlaces profundos y ShellRoute para BottomNavigationBar. Use go_router para proyectos nuevos, especialmente si se requiere soporte web o patrones de navegación complejos con rutas protegidas.

Resumen

  • Navigator — gestor de navegación de Flutter que controla la pila de Routes con los métodos push, pop, pushReplacement y pushAndRemoveUntil
  • Pila LIFO — cada push añade un Route en la cima, pop elimina el superior; la pila almacena el historial de transiciones en orden de último en entrar, primero en salir
  • pushReplacement — reemplaza la pantalla actual sin posibilidad de volver, crítico para escenarios de inicio de sesión y onboarding
  • Rutas nombradas — pushNamed con RouteSettings y onGenerateRoute para definición centralizada de rutas con paso de argumentos
  • Navigator 2.0 — navegación declarativa mediante Router, RouterDelegate y RouteInformationParser para enlaces profundos web
  • go_router — envoltorio recomendado por Google sobre Navigator 2.0 con DSL simple y soporte de ShellRoute
  • Paso de datos — mediante arguments en pushNamed y retorno de resultado a través de Future de push usando Navigator.pop(context, value)

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también