Dart: Null Safety
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);
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.