Dart: Null Safety

Carlos Costa

De forma resumida, null safety é uma forma de garantir que o seu código não vai quebrar por causa de valores nulos.

Exemplo:

dynamic x = null
print(x);
Unhandled exception:
NoSuchMethodError: The getter ‘length’ was called on null.

Usando o operador ? podemos evitar esse tipo de erro:

dynamic x = null
print(x?.length); // null

Operador ?


O operador ? é usado para verificar se um valor é nulo ou não. Se o valor for nulo, a expressão retorna null, caso contrário, retorna o valor.

dynamic x = null
print(x?.length); // null

Também é possível usar multiplos operadores ? para fazer validações mais complexas.

dynamic x = null;
dynamic y = "hello world";
print(x?.length?.toString() ?? "unknown"); // unknown
print(y?.length?.toString()); // 11

Operador ??


O operador ?? é usado para retornar um valor padrão quando o valor for nulo.

var x = null
var y = x ?? 1

print(x ?? 0); // 0
print(y); // 1

Operador !


O operador ! é usado para dizer ao compilador que você tem certeza que o valor não é nulo.

dynamic x = null;
print(x?.length); // null
x = "hello world";
print(x!.length); // 11

Operador ??=


O operador ??= é usado para atribuir um valor padrão a uma variável se ela for nula.

dynamic y = "hello earth";
y ??= "hello world";
print(y); // hello earth

dynamic x = null;
x ??= "hello world";
print(x); // hello world

Null values em objetos


class Address {
  String city;
  String? street;

  Address({required this.city, this.street});
}

class Person {
  String name;
  int age;
  Address? address;

  Person({
    required this.name,
    required this.age,
    this.address,
  });
}

void main(List<String> args) {
  Person person1 = Person(name: 'John', age: 30);
  Person person2 = Person(
    name: 'Jane',
    age: 25,
    address: Address(
      city: 'New York',
      street: 'Broadway',
    ),
  );

  print(person1.address?.street?.toLowerCase() ?? 'unknown street');
  print(person2.address?.street?.toLowerCase() ?? 'unknown street');
}

Nesse exemplo temos total controle sobre os valores nulos, e podemos fazer validações de forma simples e segura.

Referências