Saltar al contenido principal

Tipos genéricos en PopScope

Se agregó un tipo genérico a la clase PopScope y se actualizó la firma de la función onPopInvoked.

Resumen

#

Se agregó un tipo genérico a la clase PopScope y se reemplazó onPopInvoked con un nuevo método onPopInvokedWithResult. El nuevo método toma un booleano didPop y un result como parámetros posicionales.

También se reemplazó Form.onPopInvoked con Form.onPopInvokedWithResult por la misma razón.

Contexto

#

Anteriormente, PopScope no tenía una forma de acceder al resultado del pop cuando se llamaba a onPopInvoked. El tipo genérico se agrega a la clase PopScope para que el nuevo método onPopInvokedWithResult pueda acceder al resultado seguro para tipos (type-safe).

Descripción del cambio

#

Se agregó un tipo genérico (<T>) a la clase PopScope y un nuevo método onPopInvokedWithResult. La propiedad onPopInvoked quedó obsoleta (deprecated) en favor de onPopInvokedWithResult.

También se agregó un nuevo método onPopInvokedWithResult a Form para reemplazar a onPopInvoked.

Guía de migración

#

Código antes de la migración:

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

void main() {
  runApp(
    MaterialApp(
      navigatorKey: nav,
      home: Column(
        children: [
          Form(
            canPop: false,
            onPopInvoked: (bool didPop) {
              if (didPop) {
                return;
              }
              launchConfirmationDialog();
            },
            child: MyWidget(),
          ),
          PopScope(
            canPop: false,
            onPopInvoked: (bool didPop) {
              if (didPop) {
                return;
              }
              launchConfirmationDialog();
            },
            child: MyWidget(),
          ),
        ],
      ),
    ),
  );
}

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

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

void main() {
  runApp(
    MaterialApp(
      navigatorKey: nav,
      home: Column(
        children: [
          Form(
            canPop: false,
            onPopInvokedWithResult: (bool didPop, Object? result) {
              if (didPop) {
                return;
              }
              launchConfirmationDialog();
            },
            child: MyWidget(),
          ),
          PopScope<Object?>(
            canPop: false,
            onPopInvokedWithResult: (bool didPop, Object? result) {
              if (didPop) {
                return;
              }
              launchConfirmationDialog();
            },
            child: MyWidget(),
          ),
        ],
      ),
    ),
  );
}

El tipo genérico debe coincidir con el tipo genérico de la Route en la que se encuentra el PopScope. Por ejemplo, si la ruta utiliza int como su tipo genérico, considera usar PopScope<int>.

Si los widgets PopScope se comparten entre varias rutas con diferentes tipos, puedes usar PopScope<Object?> para capturar todos los tipos posibles.

Timeline

#

Llegó en la versión: 3.22.0-26.0.pre
En lanzamiento estable: 3.24.0

Referencias

#

Documentación de la API:

Problema relevante:

PR relevante: