Saltar al contenido principal

Cambio importante en las APIs de páginas de Navigator

Reemplaza la propiedad 'onPopPage' de Navigator por la propiedad 'onDidRemovePage'.

Resumen

#

Las APIs de páginas de Navigator se han refactorizado para que puedan integrarse con los otros mecanismos de pop de Flutter.

Contexto

#

La propiedad onPopPage se añadió para limpiar las páginas después de que una página esté a punto de cerrarse (hacer pop). Para vetar el pop, devolverías false en el callback. Esto no funcionaba bien con otros mecanismos de pop en el framework, como PopScope y los gestos de retroceso de iOS.

Para integrar los mecanismos de pop del framework, era necesario refactorizar las APIs de páginas.

Descripción del cambio

#

La propiedad onDidRemovePage reemplaza a la propiedad onPopPage. Ya no puedes vetar un pop en la propiedad onDidRemovePage. En su lugar, solo eres responsable de actualizar las pages.

El mecanismo de veto ahora se gestiona con las propiedades Page.canPop y Page.onPopInvoked. Estas funcionan de manera similar a cómo usas el Widget PopScope.

Guía de migración

#

Código antes de la migración:

dart
import 'package:flutter/material.dart';

final MaterialPage<void> page1 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page2 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page3 = MaterialPage<void>(child: Placeholder());

void main() {
  final List<Page<void>> pages = <Page<void>>[page1, page2, page3];
  runApp(
    MaterialApp(
      home: Navigator(
        pages: pages,
        onPopPage: (Route<Object?> route, Object? result) {
          if (route.settings == page2) {
            return false;
          }
          if (route.didPop) {
            pages.remove(route.settings);
            return true;
          }
          return false;
        },
      ),
    ),
  );
}

Código después de la migración:

dart
import 'package:flutter/material.dart';

final MaterialPage<void> page1 = MaterialPage<void>(child: Placeholder());
final MaterialPage<void> page2 = MaterialPage<void>(canPop: false, child: Placeholder());
final MaterialPage<void> page3 = MaterialPage<void>(child: Placeholder());

void main() {
  final List<Page<void>> pages = <Page<void>>[page1, page2, page3];
  runApp(
    MaterialApp(
      home: Navigator(
        pages: pages,
        onDidRemovePage: (Page<Object?> page) {
          pages.remove(page);
        },
      ),
    ),
  );
}

Timeline

#

Introducido en la versión: 3.22.0-32.0.pre
En la versión estable: 3.24.0

Referencias

#

Documentación de la API:

Problema relevante:

PR relevante: