Los operadores con reconocimiento nulo en Dart permiten realizar cálculos en función de si un valor es nulo o no. Es una forma de abreviar expresiones mucho más largas.


Operador ??

x = y ?? z;

El operador ?? ayuda a retornar un valor con la condición de que si la primera variable de la expresión es nulo, se retorna el segundo.

// y = 1
// z = 2
x = y ?? z;
// x = 1
// y = null
// z = 2
x = y ?? z;
// x = 2

Operador ??=

x ??= y;

Se puede utilizar ??= cuando se requiere hacer una reasignación a una variable cuando es nula. Evalua la variable y si es nula, le asiga a la primera el valor de la segunda.

// x = 1
// y = 2
x ??= y;
// x = 1
// x = null
// y = 2
x ??= y;
// x = 2

Operador ?.

x?.foo();

Llamar al método de una variable nula puede ocasionar un error en tiempo de ejecución, por lo que se utiliza el operador ?. para llamar al método únicamente si la variable es no nula.

// x = [Object]
x?.foo();
// foo es llamado
// x = null
x?.foo();
// foo no es llamado

Este operador se puede utilizar en cadena

object?.child1?.child2?.foo();

Operador …?

Este es un operador relativente nuevo, incluido en la versión 2.3.0 de dart, por lo cual puede ser poco conocido. Es utilizado cuando trabajamos en la concatenación de listas.

Normalmente para concatenar 2 podemos hacer esto

lista1 = [1, 2, 3]
lista2 = [4, 5, 6]
lista = [...lista1, ...lista2]

Sin embargo si alguna de las 2 listas es nula, puede producir un error en tiempo de ejecución, por lo que cambiar el operador ... por ...? permite realizar la concatenación únicamente cuando la lista es no-nula.

lista1 = [1, 2, 3]
lista2 = null
lista = [...?lista1, ...?lista2]
// lista = [1, 2, 3]