Skip to main content

Conectar el servicio

IsselNavigationService encapsula la pila imperativa de Navigator mediante una clave estable. IsselAppController.navigation ya proporciona una instancia; conéctala a MaterialApp.navigatorKey, como en la primera app, y reutilízala desde presentación. También puedes construir un servicio directamente si tu composición lo requiere:
isReady es true cuando navigatorKey.currentState no es null; es decir, cuando el Navigator al que conectaste la clave ya está montado en el árbol de widgets. Antes de montar MaterialApp o si la clave no está conectada, vale false. Esta señal solo confirma que el Navigator está disponible: canGoBack puede seguir siendo false cuando estás en la ruta raíz. Si llamas a una operación de navegación antes del montaje, el servicio lanza StateError; no guarda ni descarta la acción para ejecutarla después. El servicio se crea por instancia, no es un singleton global y no registra destinos: tu aplicación decide qué Widget o Route empujar.

Operaciones

Las operaciones que crean MaterialPageRoute admiten settings y fullscreenDialog. Si no envías nombre, el servicio usa page.runtimeType.toString(). Para productos con metadatos de ruta, configura nombres explícitos.

Resultado tipado completo

El archivo siguiente contiene una página de selección y una vista que recibe su resultado. Usa el servicio de la raíz; muestra TypedNavigationExample(navigation: app.navigation) como contenido de una ruta montada.
El Future del push se completa al cerrar la ruta, no al terminar la transición de entrada. Una salida sin selección devuelve null. La vista caller comprueba mounted antes de actualizar su estado.

Reemplazar y limpiar la pila

Si reseteas la pila, la nueva ruta pasa a ser raíz y el retroceso devuelve false. No esperes un Future de navegación para ejecutar tareas que deban suceder mientras la ruta permanece abierta.

Retroceso y bloqueos

goBack devuelve si la solicitud fue atendida. Un PopScope(canPop: false) puede atenderla y conservar la ruta, por lo que true no significa siempre que se haya retirado una pantalla. Para decidir si el botón Volver debe aparecer, utiliza la pila real; para confirmar salida con datos sin guardar, la política pertenece a la vista y su PopScope. En móvil una raíz con Drawer puede mostrar hamburguesa y una ruta secundaria retroceso. En escritorio abrir/cerrar menú y volver son acciones distintas. No deduzcas retroceso sólo por presencia de Drawer o de un sidebar.

Router, selección y URLs

El kit no sincroniza automáticamente menú ni breadcrumbs con la pila. Deriva selectedId de la ruta activa mediante el router existente o un NavigatorObserver de la app. Un estado de selección que cambia sólo al tocar el menú queda desactualizado al hacer pop, reemplazar o recibir navegación externa. Cuando necesites URLs, deep links o pila declarativa, conserva o elige el router adecuado al producto. IsselNavigationService no ofrece enrutamiento web ni parseo de URLs. La guía oficial de navegación Flutter explica la elección entre Navigator y Router. Navegación y Widgets pertenecen a presentación/composición. El controlador devuelve resultados del negocio; dominio y repositorios no reciben destinos ni BuildContext.