Saltar al contenido principal

Migrar of a valores de retorno que no admitan nulos y agregar maybeOf

Eliminar los parámetros nullOk para ayudar con la claridad de la API frente a null safety.

Resumen

#

Esta guía de migración describe la conversión de código que utiliza varias funciones estáticas of para recuperar información de un contexto que solía devolver valores nulos (nullable), pero que ahora devuelve valores no nulos (non-nullable).

Contexto

#

Flutter tiene un patrón común que permite la búsqueda de algunos tipos de widgets (típicamente InheritedWidgets, pero también otros) utilizando funciones miembro estáticas que típicamente se llaman of.

Cuando la no nulidad (non-nullability) se convirtió en el comportamiento predeterminado, fue deseable que las APIs más utilizadas devolvieran un valor no nulo. Esto es porque escribir Scrollable.of(context) y aún requerir un operador ! o ? y un valor de respaldo (fallback) después de esa llamada se sentía incómodo, y no era idiomático para código Dart no nulo.

Gran parte de esta migración se realizó cuando eliminamos los parámetros nullOk en una migración anterior, pero algunos métodos of se omitieron en esa migración, y posteriormente se añadieron algunos con tipos de retorno nulos, en contra de nuestro patrón común.

En esta migración, los accesores of afectados se dividieron en dos llamadas: una que devolvía un valor no nulo y lanzaba una excepción cuando el valor buscado no estaba presente (todavía llamada of), y otra que devolvía un valor nulo que no lanzaba una excepción y devolvía null si el valor no estaba presente (un nuevo método llamado maybeOf).

Descripción del cambio

#

El cambio modificó estas APIs estáticas of para devolver valores no nulos. Si no se encuentra un valor, ahora también harán una aserción en modo depuración (debug mode) y lanzarán una excepción en modo producción (release mode).

Este cambio también introdujo nuevas APIs estáticas maybeOf junto con las funciones anteriores, las cuales devuelven una versión nula (nullable) del mismo valor y simplemente devuelven null si no se encuentra el valor, sin lanzar ninguna excepción.

Guía de migración

#

Para modificar tu código a fin de usar la nueva forma de las APIs, primero convierte todas las instancias de las funciones estáticas of originales (donde su nulabilidad sea importante) para usar la forma maybeOf en su lugar.

Código antes de la migración:

dart
ScrollController? controller = Scrollable.of(context);

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

dart
ScrollController? controller = Scrollable.maybeOf(context);

Luego, para las instancias donde el código llama a la API of seguida de un signo de exclamación, simplemente elimina el signo de exclamación: ya no puede devolver un valor nulo.

Código antes de la migración:

dart
ScrollController controller = Scrollable.of(context)!;

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

dart
ScrollController controller = Scrollable.of(context);

Lo siguiente también puede ser de ayuda:

Timeline

#

En versión estable: 3.7

Referencias

#

Documentación de la API:

PRs relevantes: