Menu
Coddy logo textTech

Operadores conscientes de nulos

Parte da seção Programação Orientada a Objetos do Journey de Dart da Coddy. Lição 27 de 110.

Além de ?. e !, o Dart fornece operadores adicionais que tornam o trabalho com valores anuláveis mais conciso. Estes operadores null-aware ajudam você a escrever um código mais limpo ao lidar com possíveis valores nulos.

O operador de coalescência nula ?? retorna o valor da esquerda se ele não for nulo, caso contrário, retorna o valor da direita:

String? nickname;
String displayName = nickname ?? 'Guest';
print(displayName);  // Guest

nickname = 'Alex';
displayName = nickname ?? 'Guest';
print(displayName);  // Alex

O operador de atribuição null-aware ??= atribui um valor apenas se a variável for atualmente nula:

String? username;
username ??= 'Anonymous';
print(username);  // Anonymous

username ??= 'NewName';
print(username);  // Ainda Anonymous (não era nulo)

Você pode encadear o operador de acesso null-aware ?. para propriedades aninhadas:

String? city = user?.address?.city;  // Seguro mesmo que user ou address seja nulo

Estes operadores combinam bem entre si. Por exemplo, você pode acessar uma propriedade anulável e fornecer um padrão:

String greeting = user?.name ?? 'Stranger';
// Se user for nulo OU user.name for nulo, use 'Stranger'

O uso desses operadores mantém seu código legível, ao mesmo tempo em que garante a null safety em todo o seu programa.

challenge icon

Desafio

Fácil

Vamos criar um sistema de registro de convidados que demonstra como os operadores conscientes de nulos podem tornar seu código mais limpo ao lidar com informações opcionais.

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

  • guest.dart: Defina uma classe Guest que represente alguém participando de um evento. Alguns convidados fornecem todos os detalhes, enquanto outros informam apenas o básico. Sua classe deve ter:
    • Uma String name não anulável — todo convidado deve ter um nome
    • Uma String? email anulável — nem todos fornecem um e-mail
    • Uma String? dietaryPreference anulável — alguns convidados não especificam necessidades alimentares
    • Um construtor que recebe name como parâmetro obrigatório
    • Um método getDisplayEmail() que retorna o e-mail, se disponível, ou 'No email provided' usando o operador ??
    • Um método assignDefaultDiet() que define dietaryPreference como 'Standard' somente se ele for atualmente nulo, usando o operador ??=
    • Um método getEmailDomain() que retorna o tamanho do e-mail usando ?., ou null se não existir um e-mail
    • Um método printBadge() que imprime as informações do crachá do convidado
  • main.dart: Importe sua classe de convidado e registre três convidados com diferentes níveis de informação:
    • Crie um convidado chamado 'Alice', defina o e-mail dela como 'alice@company.com' e a preferência alimentar como 'Vegetarian'
    • Crie um convidado chamado 'Bob', defina apenas o e-mail dele como 'bob@email.org' (deixe a preferência alimentar como nula)
    • Crie um convidado chamado 'Charlie' (deixe tanto o e-mail quanto a preferência alimentar como nulos)
    • Chame assignDefaultDiet() nos três convidados
    • Para cada convidado, na ordem, chame printBadge() e depois imprima Email length: [result] usando getEmailDomain()

O método printBadge() deve imprimir neste formato:

=== Guest Badge ===
Name: [name]
Email: [getDisplayEmail()]
Diet: [dietaryPreference or "Not specified"]

Observe como a preferência alimentar de Alice permanece 'Vegetarian' porque ??= só atribui um valor quando o valor é nulo, enquanto Bob e Charlie recebem a dieta padrão 'Standard'.

Saída esperada:

=== Guest Badge ===
Name: Alice
Email: alice@company.com
Diet: Vegetarian
Email length: 17
=== Guest Badge ===
Name: Bob
Email: bob@email.org
Diet: Standard
Email length: 13
=== Guest Badge ===
Name: Charlie
Email: No email provided
Diet: Standard
Email length: null

Experimente você mesmo

import 'guest.dart';

void main() {
  // TODO: Criar uma convidada chamada 'Alice'
  // Definir o e-mail dela como 'alice@company.com'
  // Definir a preferência alimentar dela como 'Vegetarian'

  // TODO: Criar um convidado chamado 'Bob'
  // Definir apenas o e-mail dele como 'bob@email.org'
  // Deixar a preferência alimentar como null

  // TODO: Criar um convidado chamado 'Charlie'
  // Deixar tanto o e-mail quanto a preferência alimentar como null

  // TODO: Chamar assignDefaultDiet() em todos os três convidados

  // TODO: Para cada convidado em ordem (Alice, Bob, Charlie):
  // - Chamar printBadge()
  // - Imprimir 'Email length: [result]' usando getEmailDomain()
}
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

Pratique por conta própria: Compilador de Dart online