Saltar al contenido principal

Cuando una ruta se elimina de la pila, los futures asociados deben completarse

Antes de este cambio importante, las rutas creadas por Navigator y que esperaban resultados nunca podían completarse si la ruta se eliminaba en lugar de cerrarse (pop).

Resumen

#

Cuando se insertan (push) rutas, los desarrolladores pueden esperarlas (await) para recibir una notificación cuando se eliminen (pop). Sin embargo, esto no funcionaba cuando se eliminaban porque el future asociado nunca se completaba.

Contexto

#

Todos los métodos de Navigator que llaman a remove tenían este problema. Al usar complete, el problema se resuelve correctamente, permitiendo a los desarrolladores pasar un resultado.

Descripción del cambio

#

Todos los métodos de Navigator se han actualizado para que ya no llamen a remove, sino que utilicen complete. Los menús contextuales ahora se construyen a partir del parámetro contextMenuBuilder.

Todos los métodos que utilizan directamente complete ahora aceptan un parámetro opcional result para devolverlo al future asociado. Otros métodos que utilizan indirectamente remove actualmente devuelven null. En el futuro, podríamos extender estos métodos con una función de callback opcional para permitir a los desarrolladores manejar la lógica de pop en escenarios indirectos (como removeUntil).

Antes de este PR, los métodos a continuación no pueden devolver un resultado:

dart
Navigator.of(context).removeRoute(route);
Navigator.of(context).removeRouteBelow(route);

Después de este PR, los métodos pueden devolver un resultado:

dart
Navigator.of(context).removeRoute(route, result);
Navigator.of(context).removeRouteBelow(route, result);

Guía de migración

#

Si implementaste RouteTransitionRecord y utilizaste markForRemove, debes usar markForComplete en su lugar. markForRemove ahora está marcado como obsoleto.

Para otros desarrolladores, no se requieren cambios. El Navigator continúa funcionando como se esperaba con nuevas capacidades.

Timeline

#

Llegó en la versión: 3.31.0-0.0.pre
En la versión estable: 3.32

Referencias

#

Documentación de la API:

#

Issues relevantes:

#

PRs relevantes:

#