Null Safety en Dart y Flutter

En esta entrada vamos a hablar sobre el null safety en Flutter en cual es el nuevo esquema que tenemos a partir de Flutter 2 y Dart 2.12.

Lo primero que tienes que hacer antes de comenzar es verificar la versión de Flutter que tienes instalada en tu equipo y puedes chequear la de Dart:

Conocer la versión actual de Dart y Flutter

dart --version
flutter --version

Y verás unas llamadas como las siguientes:

Dart SDK version: 2.13.4 (stable) (Wed Jun 23 13:08:41 2021 +0200) on "windows_x64"
Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git
Framework • revision f4abaa0735 (2 months ago) • 2021-07-01 12:46:11 -0700
Engine • revision 241c87ad80
Tools • Dart 2.13.4

Recuerda que Flutter 2 o superior es la que tiene soporte con el NullSafety

Operadores claves en para trabajar con el Null Safety en Dart

En la guía oficial tenemos mucha información al respecto con el Null Safety, lo primero que tenemos que conocer es sobre los operadores, los operadores son un elemento clave para trabajar con el Null Safety.

En esta entrada quiero hacerte un resumen de los aspectos que tienes que tener en cuenta al momento de trabajar con el Null Safety aunque esto es una aspecto que tienes que practicar, por lo tanto, te recomiendo que veas los videos que dejo aquí adjunto en esta entrada.

De igual manera vamos a ir a dar algunas lecciones.

¿Qué es el Null Safety?

Esto lo podemos definir fácilmente, para esto tienes que entender el propósito, el problema de los nulos es cuando tenemos una variable u objeto que PUEDE ser nulo en algún momento pero desde tu app NO lo detectas y realizas operaciones sobre la misma teniendo resultados catastróficos; operaciones como las siguientes:

var texto = null;
Text(texto)

Van a hacer crashear tu aplicación o la ventana de la muerte de "tu aplicación no responde" o que solamente se cierra de golpe.

Para eso esta esta característica que incorpora lenguajes de programación modernos como Kotlin,. swift y por supuesto ahora también Dart, para prevenir estos fallos en nuestras aplicaciones.

En qué consiste

El null safety consiste en EVITAR que el usuario pueda tener valores nulos, así de simple, es como negar una realidad lo más posible; por lo tanto, nuestra variables u objetos POR DEFECTO NO pueden ser nulos, así de simple.

Por lo tanto, ahora nuestras variables son de tipo int, String, bool... NO puede tomar valores nulo, ya que el editor te daría un error en tiempo de compilación y NO en ejecución, por lo tanto tu código NO compilara.

Tipos que puedes ser nulos

Pero nosotros sabemos que esto es una verdad a media porque en muchas ocasiones existen escenarios en las cuales esto no se puede cumplir y tienes que trabajar con valores que pueden ser nulos, en estos casos puedes colocar el operador de ? delante de tus tipos de datos; por ejemplo:

  • int?
    String?

Estos pueden ser nulos que es el enfoque que tenemos originalmente, pero debes de evitar su uso lo más que puedas!

Lo mejor de todo es que siempre el editor te está diciendo vas a tener problemas con los nulos ya que TODOS los paquetes que uses tienen que tener esta protección.

Operadores claves

Como comentaba, existen múltiples escenarios en los cuales te ves obligado a emplear tipos que PUEDEN ser nulos, en este caso lo tienes que hacer DE MANERA SEGURA.

Smarter null-aware methods
String? notAString = null;
print(notAString?.length);

Esta operación devolverá nulo, en vez de detener la app, y para eso funciona el operador de ? sobre algún método o propiedad que PUEDE ser nulo.

Otro operador empleado, es el de OR, en el cual cuando intentas asignar un valor que NO puede ser nulo sobre uno que si (por ejemplo esta lista) si el mismo NO tiene un valor, entonces le das un valor por defecto

bool exist = list?.isEmpty ?? false

Null assertion operator

Este operador es similar al primero, pero tienes que estar COMPLETAMENTE seguro que la operación NO va a devolver nulo, porque si lo es, la aplicación dará una excepción y con esto, un posible cuelgue:

error!.toUpperCase()

Estos ejemplos los he tomado de la documentación oficial

Estos son unos casos que vemos en detalle en los videos adjuntos a esta publicación.

Qué pasa con las clases

En las clases tenemos otro problema y es que declaramos propiedades que por defecto NO inicializamos, para esto existen muchas formas de hacerlo:

Si NO tenemos constructor; podemos emplear el operador de late:

class _MyAppState extends State<MyApp> {
 late int _startI;
 late int _endI;
 @override
 void initState() {
   this._startI = 0;
   this._endI = 1;
 }
}

En el cual indicamos en resumidas cuentas que, ANTES de hacer un GET de la propiedad, VAMOS a darle un valor a esa propiedad.

Esto es útil cuando estamos trabajando por ejemplo con los state y los stateful widgets, que tenemos una función init State en la cual generalmente inicializamos estas propiedades.

Si empleas un constructor para tu clase, andes de definir el cuerpo del mismo con las {} debes hacer una inicialización en línea de esas propiedades

Hay mucho más que decir, pero creo firmemente que esto es un aspecto que se aprende más en la práctica, por lo tanto, si quieres aprender más, no dudes en ver los videos asociados en la lista de reproducción.
 

- Andrés Cruz

In english
Andrés Cruz

Desarrollo con Laravel, Django, Flask, CodeIgniter, HTML5, CSS3, MySQL, JavaScript, Vue, Android, iOS, Flutter

Andrés Cruz En Udemy

Acepto recibir anuncios de interes sobre este Blog.