Mobile App Development · Dart/Flutter

22 · Nullability Safety

O conjunto de regras do Dart que evita erros de valores nulos inesperados: tipos nullable, os operadores ??, ?. e !, promoção de tipo e late.

1Objetivo da aula

Nesta aula você vai entender por que o Dart não aceita null por padrão, como declarar tipos nullable com ?, como fornecer valores padrão com ??, acessar membros com segurança usando ?., aproveitar a promoção de tipo depois de um if (valor != null), usar o operador ! com responsabilidade e adiar inicializações com late.

2O que vamos aprender

String vs String?

Por padrão, uma variável não aceita null. Adicionar ? ao tipo cria um tipo nullable diferente, que pode conter null.

??

Operador de coalescência nula: retorna o valor à esquerda se não for nulo, ou o valor à direita como alternativa.

?.

Acesso seguro: chama um método ou lê uma propriedade apenas se o valor não for nulo; caso contrário, a expressão inteira retorna null.

Promoção de tipo

Depois de um if (valor != null), o Dart trata a variável como não-nullable dentro do bloco, sem precisar de ?. ou !.

!

Afirma ao compilador que o valor não é nulo naquele ponto. Se estiver errado, lança um erro em tempo de execução — use com cautela.

late

Indica que uma variável não-nullable será inicializada antes do primeiro uso, mesmo que não seja no construtor.

3Exemplo comentado

// Demonstração combinada de null safety em Dart.
void main() {
  // String? declara uma variável que pode ser String ou null.
  String? apelido;
  // ?? fornece um valor padrão quando 'apelido' for nulo.
  print('Apelido: ${apelido ?? 'Sem apelido'}');

  // Busca um nome que pode ou não existir.
  String? nome = buscarNome(incluirNome: true);

  // Promoção de tipo: dentro do if, 'nome' é tratado como String (não-nullable).
  if (nome != null) {
    print('Nome em maiusculas: ${nome.toUpperCase()}');
  } else {
    print('Nome nao informado');
  }

  // ?. acessa toUpperCase() apenas se 'nome' não for nulo.
  print('Acesso seguro: ${nome?.toUpperCase()}');
}

// Retorna uma String se 'incluirNome' for true, ou null caso contrário.
String? buscarNome({required bool incluirNome}) {
  return incluirNome ? 'ana' : null;
}

4Saída esperada

Apelido: Sem apelido
Nome em maiusculas: ANA
Acesso seguro: ANA

5Do conteúdo para a prática

6Prática sugerida