O Null Safety veio junto com a atualização do Dart 2.0, o que mudou o jeito de se escrever código. Neste post iremos nos aprofundar mais em que situações podemos usá-lo e como isso impacta no nosso dia a dia como devs.
No meu post anterior, eu expliquei um pouco sobre o que é e para o que serve o Null Safety. Como uma maneira de validar seu código, o Null Safety trouxe mais confiança na hora de escrevê-lo, permitindo o Sound Null Safety avisar o compilador sobre quais variáveis precisam de null check.
Para exemplificar o uso no Null Safety, podemos pensar na seguinte situação:
Você possui um usuário e ele precisa ter um nome e um sobrenome, se rodarmos esses códigos, o resultado disso será uma String John Doe. Porém, o resultado poderá ser uma String vazia se não a preenchermos, o que gera a necessidade de verificarmos se as variáveis estão nulas.
Até então nada de novo. Porém, nem sempre lembramos de verificar se todas as variáveis estão com algum valor. Para isso serve o Null Safety: ter a garantia de que suas variáveis terão valor quando necessário. Ativando o Null Safety no código acima, podemos validar a variável mesmo antes de utilizarmos ela, não permitindo rodar esse código sem que estes problemas sejam resolvidos.
Sendo assim, no caso do nosso requisito, nós permitirmos que os nomes sejam nulos, mudamos o tipo do objeto de String para String?, avisando ao compilador de que essas variáveis vão ser nulas e nós sabemos disso.
Outro caso que podemos nos deparar é em funções onde a nossa variável pode ser nula e a nossa chamada da função não permitir que passemos valores nulos, como o exemplo abaixo:
Nesse caso, podemos utilizar de algumas técnicas para resolvermos o problema.
A primeira é avisar para o compilador que temos certeza de que essas variáveis não serão nulas, adicionando uma exclamação na frente da variável da seguinte forma:
Mas para isso, devemos ter 100% de certeza que as variáveis serão preenchidas, caso contrário, a aplicação irá retornar uma exceção!
A segunda técnica é validar anteriormente se as variáveis são nulas ou não, mantendo a segurança da função, da seguinte forma:
O que faz com que o código retorne à forma que escrevemos anteriormente sem null safety
E por fim, a terceira técnica é utilizar valores default caso o valor seja nulo da seguinte forma:
Vale comentar também que se você optar por aceitar nulos em sua função, o Dart te lembra caso você esqueça de verificar se sua variável é nula ou não, como no exemplo abaixo:
Mas, o que acontece se você quer definir uma variável como non-nullable, porém só irá definir o valor dela mais a frente no código? Para isso utilizamos o operador late.
Quando você tem a certeza que irá definir a variável, como em um construtor de classe, por exemplo, o Dart irá apontar como um erro a variável estar nula mesmo atribuindo ela ao construtor. Veja:
Para avisar o Dart de que essa variável será preenchida e que temos certeza disso, usamos o operador Late, ficando dessa maneira:
Assim, continuamos usando o Null Safety e tendo a confiança de que a variável será preenchida.
Com operadores ?, ! e late, agora podemos utilizar Null Safety em nosso código de uma forma simples e intuitiva em nossas variáveis, facilitando na hora da escrita e leitura, além de automaticamente melhorarmos a performance da nossa aplicação. Lembre-se de continuar estudando o Null Safety para conseguir usar todo o potencial dele.