Menu
Coddy logo textTech

Introdução ao Null Safety

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy — lição 23 de 110.

Uma das fontes mais comuns de bugs na programação é tentar usar um valor que não existe. No Dart, essa "ausência de valor" especial é representada por null. O recurso de null safety do Dart ajuda você a capturar esses erros antes mesmo de seu código ser executado.

Sem null safety, qualquer variável poderia ser potencialmente null, levando a falhas em tempo de execução quando você tenta usá-la:

// No Dart antigo (sem null safety)
String name;  // Poderia ser null!
print(name.length);  // Falha se name for null

Com o null safety ativado (Dart 2.12+), o compilador distingue entre variáveis que podem conter null e aquelas que não podem. Por padrão, as variáveis são não anuláveis (non-nullable) - elas devem sempre conter um valor válido:

String name = 'Alice';  // Deve ter um valor
print(name.length);     // Seguro - name nunca é nulo

O compilador se recusará a compilar o código onde uma variável não anulável possa ser null. Isso desloca a detecção de erros do tempo de execução para o tempo de compilação, tornando seus programas mais confiáveis. Nas próximas lições, você aprenderá como declarar tipos anuláveis quando você realmente precisar deles, e os operadores que o Dart fornece para trabalhar com valores potencialmente nulos de forma segura.

challenge icon

Desafio

Fácil

Vamos construir um sistema simples de cartão de contatos que demonstra a importância das variáveis não anuláveis (non-nullable). Você criará um sistema onde cada contato deve ter informações válidas e garantidas.

Você organizará seu código em dois arquivos:

  • contact.dart: Defina uma classe Contact que representa as informações de contato de uma pessoa. Como estamos trabalhando com null safety, cada campo deve ter um valor válido - nenhum dado ausente é permitido! Sua classe deve ter:
    • Um String firstName para o primeiro nome do contato
    • Um String lastName para o sobrenome do contato
    • Um String email para o endereço de e-mail do contato
    • Um int phoneDigits para o número de dígitos em seu número de telefone
    • Um construtor que recebe todos os quatro valores
    • Um getter fullName que retorna o primeiro e o último nome combinados com um espaço entre eles
    • Um método displayCard() que imprime as informações do contato
  • main.dart: Importe sua classe de contato e crie dois contatos para demonstrar que todos os campos têm valores garantidos:
    • Crie um contato com o primeiro nome 'Emma', sobrenome 'Wilson', e-mail 'emma@mail.com' e dígitos do telefone 10
    • Crie um contato com o primeiro nome 'James', sobrenome 'Brown', e-mail 'james@work.com' e dígitos do telefone 11
    • Chame displayCard() em cada contato na ordem listada acima

O método displayCard() deve imprimir exatamente neste formato:

--- Contact Card ---
Name: [fullName]
Email: [email]
Phone digits: [phoneDigits]

Observe como cada variável deve ser inicializada com um valor real - isso é o null safety em ação! O compilador garante que, quando você acessar fullName, email ou qualquer outro campo, ele sempre conterá dados válidos.

Saída esperada:

--- Contact Card ---
Name: Emma Wilson
Email: emma@mail.com
Phone digits: 10
--- Contact Card ---
Name: James Brown
Email: james@work.com
Phone digits: 11

Folha de consulta

O Dart usa null safety para evitar bugs causados pelo uso de valores que não existem. O valor especial null representa a ausência de um valor.

Com o null safety habilitado (Dart 2.12+), as variáveis são não-nulas por padrão — elas devem sempre conter um valor válido:

String name = 'Alice';  // Deve ter um valor
print(name.length);     // Seguro - name nunca é nulo

O compilador impede a compilação do código se uma variável não-nula puder ser null, transferindo a detecção de erros do tempo de execução para o tempo de compilação.

Experimente você mesmo

import 'contact.dart';

void main() {
  // TODO: Criar o primeiro contato com:
  // - primeiro nome: 'Emma'
  // - sobrenome: 'Wilson'
  // - e-mail: 'emma@mail.com'
  // - dígitos do telefone: 10

  // TODO: Criar o segundo contato com:
  // - primeiro nome: 'James'
  // - sobrenome: 'Brown'
  // - e-mail: 'james@work.com'
  // - dígitos do telefone: 11

  // TODO: Chamar displayCard() em cada contato na ordem
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Programação Orientada a Objetos