Null-Safety na Linguagem Dart
Se você está aprendendo Dart e ainda não compreendeu bem a questão do null-safety, eu acredito que com essa explicação ficará mais simples!
Null-Safety é uma maneira de controlar o que pode ser null e o que não pode ser.
Atenção
Se você quer permitir que uma variável receba um valor null, basta adicionar um "?" na frente da tipagem, como isto:
String? nome;
A variável nome inicia como null e também pode receber esse valor quando quiser, agora vamos usa-lá.
String? nome;
print(nome);
// Output: null
Existe algumas expressôes que podemos usar, entre elas estão:
- ?? ( Recebe um valor do lado direito caso o esquerdo seja null )
- ! ( Afirma que uma variável que pode ser null não é contém null )
- ??= ( Atribui um valor a uma variável caso ela seja null )
Vamos aos exemplos, digamos que eu queira mostrar algo caso nome seja null, eu faria algo como:
String? nome;
print(nome ?? 'Nenhum nome foi informado');
// Output: Nenhum nome foi informado
E se eu quissese afirmar que a variável nome tem algum valor que é diferente de null?
String? nome;
print(nome!);
// Output: Uncaught TypeError: Cannot read properties of null (reading 'toString')Error: TypeError: Cannot read properties of null (reading 'toString')
Pois é! Daria um erro, isso porque nós mentimos, a variável nome era null mas nós afirmamos que não era, por isso que deu erro, o "!" é muito bom quando você quer dizer que tem certeza que uma variável não é null:
String? nome;
nome = "Carlos"; // Supondo que em algum momento eu fiz isso.
print(nome!);
// Output: Carlos
Mas e se eu quiser mudar a variável apenas se ela for null?
Simples:
String? nome;
nome ??= "Carlos";
print(nome);
// Output: Carlos
Viu como é simples?
Então você pode fazer isso com String, int, bool, e por ai vai...
Até em funções, veja exemplos:
// Não temos a chance de retornar um null aqui
String obterNome() {
return "Nome";
}
Eu posso usar a função obterNome sem medo de receber um null
String? tentarObterNome() {
final now = DateTime.now();
if (now.day == 1) {
return "Carlos";
}
return null;
}
Já aqui temos uma regra, o nome só será retornado caso seja dia um do mês.
É isso... espero que tenha ajudado o pessoal do Dart