• Home

    Escolha seu Plano

    Carreiras Alura

    Evolua com profundidade técnica, direção clara e aplicação prática.

    Jornadas guiadas do básico ao avançado com checkpoints práticos, desenhadas para quem busca profundidade e protagonismo técnico.

    Iniciante

    Comece do zero com uma trilha clara e progressiva.

    Fundamentos práticos para dar os primeiros passos com segurança e construir uma base sólida.

    Intermediário

    Continue sua evolução com cursos que conectam fundamentos, ferramentas e prática profissional. Ganhe autonomia, e avance para projetos mais completos.

    Avançado

    Aprofunde temas técnicos e estratégicos para enfrentar desafios mais complexos. Explore boas práticas, arquitetura, performance com visão profissional.

    Cursos

    Ver mais cursos de Back-end
    • Pensamento computacional: fundamentos da computação e lógica de programação
    • Lógica de programação: mergulhe em programação com JavaScript
    • DDD: fundamentos do design orientado a domínio
    • ASP.NET: autenticação e autorização em APIs e aplicações web
    • Microsserviços: migração de monólitos e modularização

    Cursos

    Ver mais cursos de Dados
    • Python para Dados: primeiros passos
    • Excel: domine o editor de planilhas
    • Engenharia de Dados: Orquestração de Pipelines com Apache Airflow
    • Power BI Desktop: construindo meu primeiro dashboard
    • Governança e Arquitetura de Dados

    Cursos

    Ver mais cursos de Inteligência Artificial
    • IA: Explorando o Potencial da Inteligência Artificial Generativa
    • Engenharia de Prompt: Criando Prompts Eficazes para IA Generativa
    • Claude para Análise de Dados: prompts, integrações e automações
    • Agno: criando agentes e sistemas multiagente
    • Engenharia de software na era da IA: segurança de aplicações com agentes, MCPs e código gerado por IA

    Cursos

    Ver mais cursos de Front-end
    • HTML e CSS: ambiente, estrutura e estilo
    • React: realizando testes avançados com Jest e Testing Library
    • React: integrando TypeScript em projetos
    • JavaScript: aprendendo a programar
    • React: aplicando arquiteturas de Micro frontends

    Cursos

    Ver mais cursos de DevOps
    • Sistema Operacional Linux: fundamentos e administração prática
    • Containers e Docker: empacotamento, isolamento e gestão
    • Redes: dos conceitos iniciais à criação de uma intranet
    • Linux: gerenciando diretórios, arquivos, permissões e processos
    • Cibersegurança: Fundamentos e práticas integradas

    Cursos

    Ver mais cursos de UX & Design
    • UX Research: mapeando a experiência da pessoa usuária
    • UX/UI Design: Entregando produtos digitais com IA
    • UI Design: Prototipação e animações interativas
    • Figma: Conhecendo o programa
    • Product Design: métricas e ciclo de vida do produto

    Cursos

    Ver mais cursos de Gestão & Negócios
    • Canva: Criação de landing pages e e-mail marketing
    • Agilidade: como ela pode ajudar a criar um time de alta performance
    • Google Analytics 4: Extrair insights e configurar eventos
    • Management 3.0: gerencie o ambiente, não as pessoas
    • Automação de processos com n8n: Inteligência de dados para Marketing

    Cursos

    Ver mais cursos de Mobile
    • React Native: Estilização e Layouts com Flexbox e StyleSheet
    • Flutter: Graphql e suporte offline
    • Android com Gemini: Trabalhando com textos e imagens na IA
    • Dart: trabalhando com orientação a objetos
    • React Native: Dominando Listas com FlatList e ScrollView

    Carreiras

    Ver mais carreiras
    • Especialista em IA
    • Engenharia de IA
    • Ai native software engineering
    • Arquitetura de Soluções com IA
    • AI Product Design
    • Engenharia de Machine Learning
    • Desenvolvimento Front-End React
    • Engenharia de Dados
    • Cloud Security
    • Social Media Marketing
    • Engenharia de Agentes de IA

    Cursos

    • Engenharia de Prompt: Prompts Eficazes para IA Generativa
    • Claude Code: Criando sua Primeira Aplicação
    • Python: Crie sua Primeira Aplicação
    • Git e GitHub: Compartilhando e Colaborando
    • N8N: Fluxos de Trabalho Avançados

    Cursos

    • Copilot Studio: Solução Multiagentes
    • Padrões de API HTTP e Modelagem de APIs
    • Python para Análise de Dados com SQL
    • Docker: Criando e Gerenciando Containers
    • Design com IA: Otimizando o Processo Criativo

    Cursos

    • Model Context Protocol (MCP)
    • Spec-Driven Development: Dev Assistido por Agentes
    • Arquitetura de Sistemas Distribuídos com Java
    • Governança de Modelos e Reprodutibilidade
    • Pentest: Vulnerabilidades em Aplicações Web

    Escolha seu Plano

    Skills & Go

    O Skills & Go é para Tech Leads, Product Managers, estrategistas e early adopters que transformam ideias em soluções de alto impacto. Em cursos ao vivo e 100% online, você domina a nova era da IA em tempo real.

    Aulas ao vivo

    Saiba mais
    • Agentic Engineering: orquestre múltiplos agentes com confiabilidade
    • Building AI Products: transforme ideias em produtos reais com IA
    • AI Data Strategy: transforme dados em decisões estratégicas com IA

    Escolha seu Plano

    Eventos Alura

    Nossos eventos são pensados para quem quer estar à frente das mudanças em tecnologia, IA e inovação. Em experiências presenciais, você acompanha tendências e se conecta com especialistas que estão moldando o futuro.

    Próximos eventos

    • Imersão Engenharia de Software: Dev na Era da IA
    • IA Conference
    • Alura Signals
  • Talent Lab
  • IA

    Escolha seu Plano

    Conteúdos gratuitos

    Explore conteúdos gratuitos para aprender tecnologia no seu ritmo. Encontre artigos com conteúdos técnicos para aprender na prática, notícias para acompanhar as principais tendências do mercado e o Alura Labs, com análises e reflexões de especialistas sobre tecnologia, IA e carreira.

    Conteúdos gratuitos

    • Artigos
    • Notícias
    • Alura Labs
  • Para Empresas
Ver planos
Links principais
  • Planos e Promoções
  • Links complementares do menu mobile
  • Talent lab
  • Inteligência Artificial
  • Pós Graduações
  • Para Empresas
  • Sobre a Alura
  • Grupo Alun
  • Entrar
    • Home
    • Carreiras
    • Skills & Go
    • Talent Lab
    • Inteligência Artificial
    • Pós Graduações
    • Artigos
    • Sobre a Alura
    • Grupo Alun
    LoginContato
    • LinkedIn
    • Instagram
    • YouTube
    1. Página inicial
    2. Mobile
    3. Dart no Null Safety: o que é e como funciona no Dart 2.12

    Dart no Null Safety: o que é e como funciona no Dart 2.12

    7 min7 minutos de leitura

    7 min7 minutos de leitura

    Publicado: 27/04/2021

    Última atualização: 07/01/2026

    1. Erros de valor Null
    2. Aplicação do Null Safety
    3. Migração
    4. Primeiro passo: Verificar
    5. Segundo passo: Migrar
    6. Conclusão
    7. Referências

    A partir do Dart 2.12, temos a possibilidade de usar o Null Safety para facilitar nossas aplicações, dificultando erros de valores nulos. Aprenderemos a identificar erros de valores nulos, aplicar no nosso projeto do ByteBank, atualizar o Dart para a nova versão e migrar um projeto inteiro! Assim podemos criar códigos complexos com mais facilidade!

    Erros de valor Null

    Existem infinitos erros que podem acontecer por conta de um valor nulo:

    • Você pode estar esperando um dado do seu back-end, mas ele não existe ainda…
    • Você pode criar uma lista que muda de tamanho de acordo com a quantidade de produtos…

    Vamos dar uma olhada no nosso antigo conhecido: o ByteBank. Nele, temos uma lista de transferências que depende da quantidade de transferências disponíveis no nosso servidor API.

    Imagem da lista de transações no aplicativo, exibindo duas transações de $200 para a conta número 1000

    return ListView.builder(
     itemBuilder: (context, index) {
       final Transaction transaction = transactions[index];
       return Card(
         child: ListTile(
           leading: Icon(Icons.monetization_on),
           title: Text(
             transaction.value.toString(),
             style: TextStyle(
               fontSize: 24.0,
               fontWeight: FontWeight.bold,
             ),
           ),
           subtitle: Text(
             transaction.contact.accountNumber.toString(),
             style: TextStyle(
               fontSize: 16.0,
             ),
           ),
         ),
       );
     },
     itemCount: transactions.length, /// não pode ser nulo
    );
    

    Mas e se não tivéssemos nenhuma transferência?

    imagem do erro no aplicativo, que é exibido em uma tela vermelha

    Nesse caso, nossas transferências teriam o valor null e a ListView não poderia ser buildada, causando a famosa Tela Vermelha.

    Para resolver isso, no passado, usávamos uma condição que ignorava o valor nulo.

    if(snapshot.hasData){ // condição inicial para impedir o nulo
     final List<Transaction> transactions = snapshot.data;
     if(transactions.isNotEmpty){ // segunda condição para impedir o nulo
       return ListView.builder(...);
     }
    }
    return CenteredMessage('No Transactions Found', icon: Icons.warning); // caso seja nulo, buildar essa mensagem
       break;
    }
    return CenteredMessage('Unknown Error'); // caso seja nulo, buildar essa mensagem
    
    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Aplicação do Null Safety

    Agora, as coisas funcionam de uma forma levemente diferente. Por padrão, toda variável que criamos não pode receber valor nulo.

    código int cafe = null exibindo a mensagem que avisa que o valor não pode ser nulo

    Mas e se quisermos ter um valor nulo?
    Existem alguns momentos em que precisamos lidar com valores nulos, então, como podemos garantir que nossa variável vai receber o valor nulo?

    Para esses casos, basta adicionar o sinal ? e, em seguida, o tipo da variável.

    int? cafe = null;
    

    *Existem casos extremos em que precisamos ficar alterando a propriedade da nossa variável. *
    Imagina o seguinte: você está fazendo uma função, e ela não pode receber um valor nulo, mas, por algum motivo, um dos atributos dela veio nulo. O que podemos fazer para garantir que esse valor vai ser transformado em não nulo?

    class Cafe {
      String _temperatura; // criei a Temperatura
      void esquentar() { _temperatura = 'quente'; } // Defino a Temperatura para quente
      void esfriar() { _temperatura = 'gelado'; }
      String servir() => _temperatura + ' cafe'; // Servir o Cafe com a Temperatura 
    }
    main() {
      var cafe = Cafe(); // Fazer o Cafe
      cafe.esquentar(); // Esquentar o Cafe
      cafe.servir(); // Servir o Cafe sem esperar que ele já esteja quente
    }
    

    Note que, no momento em que estamos servindo, estamos esquentando! Nossa função não espera o _temperatura ser = ‘quente’ antes de servir… Ou seja, se for rápida o suficiente, ela pode entregar o café com a _temperatura = ‘null’

    Para esses casos, basta adicionar o sinal ! no tipo da variável.

    class Cafe {
      String? _temperatura; // Criar a Temperatura que não pode ser nula
      void esquentar() { _temperatura = 'quente'; } // Definir a Temperatura para quente
      void esfriar() { _temperatura = 'gelado'; }
      String servir() => _temperatura! + ' cafe'; // Servir o Cafe com a Temperatura que pode ser nula.
    }
    

    Mas já dá pra notar que isso não é uma boa prática, né? Afinal, ficar colocando ? e ! a torto e a direito no código pode confundir qualquer pessoa!

    Existe um novo modificador chamado late, que permite que o valor inicialmente seja nulo, mas, quando for utilizado em alguma função ou classe, ele vai ser considerado não nulo.

    class Cafe {
      late String _temperatura; // criei a Temperatura
      void esquentar() { _temperatura = 'quente'; } // Definir a Temperatura para quente
      void esfriar() { _temperatura = 'gelado'; }
      String servir() => _temperatura + ' cafe'; // Servir o Cafe com a Temperatura só depois que a _temperatura for diferente de nula.
    }
    

    O que acontece é que o late pede para a _temperatura ser usada na função somente quando ela já tiver deixado de ser null.

    Migração

    Vamos agora migrar um aplicativo para utilizar o Null Safety. Antes de tudo, temos de ter certeza de que tudo está nos conformes e para isso vamos usar o comando flutter doctor e dart --version no terminal para ver se temos tudo atualizado!

    Resposta do comando flutter doctor, com o Flutter atualizado para a versão 2.0.3, o DART na versão 2.12.2 e sem nenhuma pendência

    Para que tudo funcione, precisamos do Flutter na versão mínima 2.0.0 e o Dart na versão mínima 2.12.0. Caso você precise atualizar algum deles, utilize o comando flutter upgrade e dart upgrade, respectivamente.

    Agora temos de atualizar nosso projeto!

    Existem dois jeitos de migrar seu projeto. A grande maioria de nós vai tentar migrar um projeto do jeito manual:

    • Ir manualmente no pubspec.yaml e atualizar os pacotes um por um, “na mão”, depois substituir as depreciações uma a uma até que o projeto não tenha nenhum erro ou warning.

    Devo alertar você que o jeito manual é muito trabalhoso e pode te dar algumas noites sem sono e alguns cabelos brancos. Então, vou te convencer a fazer de um outro jeito!

    Primeiro passo: Verificar

    Saber quando devemos atualizar nosso projeto é essencial! Para isso, verifique quais são os pacotes que você usa no seu projeto e se eles já têm a versão que aceite o Dart 2.12 (Null Safety).

    Atente-se aos pacotes que dependem de outros pacotes!
    Okay, mas como vou saber se meus pacotes têm suporte pro Null Safety? Simples, para isso basta usarmos o comando no terminal:
    dart pub outdated --mode=null-safety

    código

    Esse comando vai analisar cada um dos seus pacotes e confirmar se eles já aceitam a Migração! (Bem melhor do que sair procurando cada um no Google, não é?)

    Caso seus pacotes tenham suporte para o Null Safety, basta usar dois comandos simples para atualizá-los!

    dart pub upgrade --null-safety
    e

    dart pub get

    Segundo passo: Migrar

    Agora nós temos o terreno pronto, então, vamos começar a migração! A primeira coisa a se fazer é lançar o comando:

    dart migrate

    Em seguida, ele vai te mandar um link que você deve acessar pelo seu navegador:

    View the migration suggestions by visiting: http://127.0.0.1:60278/Users/you/project/mypkg.console-simple?authToken=Xfz0jvpyeMI%3D

    Já no navegador, você vai ver uma interface linda com o seu código atualizado!

    Interface Interativa com o código do projeto alterado e edições propostas. Na barra superior da tela, lê-se Dart Propostas de alteração do null safety e três botões: voltar para fonte, fazer migração e ajuda. A tela está dividida em três partes: à esquerda estão as pastas e os arquivos do projeto, no centro está o código do arquivo selecionado; à direita são exibidas as edições propostas no código e também os detalhes da edição proposta

    Calma, seu código não foi alterado ainda! Essa interface está apenas sugerindo as alterações. Antes de aplicar as alterações, vamos conferir se todos os valores que devem ser nulos estão especificados e se os valores não nulos estão corretos.

    Caso você precise fazer uma alteração vá em Edit Details e selecione o hint pertinente (?ou !). Uma vez que você conferiu todo o código e, estando tudo certo, clique em Apply migration. Pronto! Seu projeto está todo atualizado para o Null Safety!

    Incrível, não é? Muito mais fácil do que ir manualmente em cada pacote e verificar todas as variáveis no projeto a fim de encontrar algum que aceite o valor nulo, não acha?

    Conclusão

    Aprendemos bastante sobre o Null Safety e como ele funciona. Descobrimos a sua importância e entendemos as diferenças entre ? , ! e o late.

    Vimos como atualizar o Dart e como ter certeza se podemos migrar o nosso projeto para aceitar o Null Safety. Utilizamos uma nova ferramenta que faz alterações inteligentes no nosso código – tudo isso de um jeito leve e rápido. Por fim, percebemos que é muito melhor usar ferramentas que fazem o trabalho pesado por nós, em vez de atualizar o código manualmente.

    Referências

    • Understanding Null Safety / Dart
    • Migrating to null safety | Dart
    Banner do Guia Tático Alura sobre carreira em tecnologia, destacando o mapa da carreira tech. A imagem convida a explorar diferentes caminhos profissionais, comparar possibilidades e encontrar a próxima fase da carreira na área de tecnologia, com chamada “Explore o mapa”.

    Avalie este artigo

    • Foto de Kako (Caio Couto Moreira)

      Autor(a)

      Kako (Caio Couto Moreira)

      Desenvolvedor Mobile apaixonado por criatividade e ensino, Kako busca sempre entender e aprender sobre o momento da tecnologia, desde o porquê de sua relevância até quais os melhores caminhos para aprender. Entusiasta por Inovação e por Invenções, está sempre em busca de novas facilidades, técnicas e tecnologias dentro do apaixonante mundo que é o Flutter.

    Explore por tópico

    • Back-end
    • Dados
    • DevOps
    • Front-end
    • Gestão & Negócios
    • Institucionais
    • Inteligência Artificial
    • Mobile
    • UX & Design

    Leia também

    • 16/07/2023

      Deeplink: o que é, como funciona e como implementar no SwiftUI

      Ler mais
    • 04/07/2018

      Utilizando features do Java 8 no Android

      Ler mais
    • 31/07/2024

      GetX: o canivete suíço do Flutter

      Ler mais
    Ver mais conteúdos

    Inscreva-se em nossa Newsletter

    Fique por dentro de conteúdos, insights e oportunidades do universo tech. Receba novidades e lançamentos direto no seu e-mail.

    Institucional

    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status
    Institucional
    • Sobre nós
    • Trabalhe Conosco
    • Para Empresas
    • Para Escolas
    • Política de Privacidade
    • Compromisso de Integridade
    • Termos de Uso
    • Canal de Ética
    • Código de Ética
    • Fale Conosco
    • Documentos Institucionais
    • Status

    A Alura

    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes
    A Alura
    • Como Funciona
    • Inteligência Artificial
    • Plataforma
    • Depoimentos
    • Instrutores(as)
    • Dev em <T>
    • Luri, a Inteligência Artificial da Alura
    • IA Conference
    • Cursos Imersivos
    • Perguntas Frequentes

    Conteúdos

    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Conteúdos
    • Alura Cases
    • Imersão Engenharia de Software: Dev na Era da IA
    • Artigos
    • Podcasts
    • Artigos de educação corporativa
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Uma Empresa do GrupoLogo Grupo Alun

    Outras empresas do Grupo Alun

    • FIAP
    • STARTSE
    • PM3
    • LUMINA

    Ao submeter seu e-mail, você concorda com a política de privacidade da Alura.

    Redes Sociais & Apps

    instagram
    youtube
    tiktok
    x
    appStore
    googlePlay
    Alura