Migrando seu projeto flutter para null-safety
Você já ouviu falar sobre null-safety?
O null-safety é uma feature liberada na versão 2.12 do dart que irá auxiliar o desenvolvedor no controle e validação de valores nulos de seus objetos e variáveis.
Por que utilizar null-safety?
Quando criamos uma variável de determinado tipo, ela pode ter um valor do tipo definido ou ser nula. Desta forma se não validarmos a variável antes de utiliza-la, corremos o risco de ter uma exceção, pois não temos a garantia do valor que a variável possui.
Utilizando o null-safety temos mais segurança e evitamos esse tipo de problema, pois por padrão as variáveis não serão nulas e nem poderão receber valores nulos, assim não sendo necessário realizar validações e evitando o risco de ter exceções geradas.
Vantagens de utilizar null-safety
- Validação de variáveis nulas agora são feitas em tempo de codificação e não mais em execução, ou seja, se uma variável receber um valor nulo, o projeto não será compilado.
- Temos a garantia que uma variável de determinado tipo terá aquele tipo.
- Evitamos diversas exceções que podem ocorrer por conta de valores nulos.
- Possível ganho de performance e builds menores.
- Código nativo do dart menor e mais rápido, pois não precisa adicionar verificações de nulos.
- Não temos mais a necessidade de validar valores nulos.
Migração para null-safety
Antes de começar a migração, precisamos atualizar o flutter e os pacotes do nosso projeto.
Atualizar o flutter para a última versão estável liberada.
Verificar se todas as packages utilizadas no projeto são compatíveis com null-safety.
Atualizar para a última versão compatível com null-safety.
Após concluir os passos acima e corrigir eventuais problemas causados pela atualização das packages, chegou a hora de realizarmos a migração do projeto.
Existe 2 formas de migrar seu projeto para null-safety.
- Utilizando a ferramenta de migração disponibilizada pelo dart.
- Manualmente.
Ferramenta de migração
A migração realizada através da ferramenta é bem simples e realiza a conversão do código de forma automática.
Executar o comando abaixo.
O seu código será analisado e será gerado um link onde será possível consultar todas as alterações necessárias em seu código.
Através do link gerado você pode selecionar as classes que deseja migrar e clicar em Apply Migration.
Executar a migração através da ferramenta é bem rápido, porém dependendo da estrutura de seu projeto, o que ela faz é adicionar “?” no tipo das variáveis. E isso diz para o dart que essa variável pode ser nula, mas não é isso que queremos, pois assim o mesmo problema continua.
Caso aconteça isso em seu projeto, o melhor é executar a migração manualmente.
Manualmente
O processo de migração manual é mais demorado dependendo do tamanho do seu projeto, mas o resultado obtido no final será muito melhor, pois você terá um controle muito maior das alterações e será possível tratar cada caso individualmente da melhor forma.
Alterar a versão do SDK no arquivo pubspec.yaml.
Execute o comando para baixar as packages atualizadas.
Será exibido na IDE todos os problemas encontrados por conta da incompatibilidade com null-safety. Agora basta começar a ajustar os problemas apontados.
A migração manual será diferente para cada projeto, porém abaixo segue algumas dicas de como seguir com os ajustes necessários.
Dicas para a migração manual
- Não se assuste com a quantidade de erros que serão apresentados.
- Comece a migração pelo nível mais baixo (Que não possui dependências de outras classes).
Classe C depende da classe B que depende da classe A.
Comece a migração pela classe A, depois B e por fim C.
- Sempre inicialize as variáveis no momento da criação.
- Evite utilizar variáveis nulas, mas caso precise que uma determinada variável possa ser nula, adicione “?” após o tipo dela.
- Para dizer ao dart que uma variável criada com “?” não está mais nula, adicione “!” após o nome dela. Lembrando que caso a variável esteja nula no momento da utilização, uma exceção poderá ser gerada.
- Caso precise criar uma variável não nula, mas não pode instanciar/inicializar ela no momento da criação, utilize o atributo late, assim será possível instanciar/inicializar em outro momento. Cuidado com esta opção, pois se utilizar a variável sem instanciar/inicializar ela, uma exceção poderá ser gerada.
- Os models sempre devem ter construtores com os campos não nulos e não inicializados.
Migração Gradativa
É possível migrar seu projeto de forma gradativa, porém os benefícios do null-safety serão aplicados apenas quando o projeto estiver 100% migrado.
Caso opte por migrar desta forma, dois pontos deverão ser observados.
- A versão do sdk deverá ser alterada apenas quando 100% do projeto for migrado.
- Atributos como “?”, “!” e “late” não iram funcionar antes de alterar a versão do sdk.
Conclusão
Aí estão algumas dicas de como migrar seu projeto para null-safety. O trabalho pode ser grande, mas acredito que vale a pena, vendo que podemos evitar diversas exceções e validações necessárias por conta de valores nulos.
Referências
https://flutter.dev/docs/null-safety
https://dart.dev/null-safety/migration-guide
https://medium.com/flutter/null-safety-flutter-tech-preview-cb5c98aba187