Menu
Coddy logo textTech

Operadores Null-Aware

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 construir um sistema de registro de convidados que demonstra como os operadores null-aware 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 representa alguém participando de um evento. Alguns convidados fornecem detalhes completos, enquanto outros fornecem 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 dietéticas
    • Um construtor que recebe name como um 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' apenas se for atualmente nulo, usando o operador ??=
    • Um método getEmailDomain() que retorna o comprimento do e-mail usando ?., ou null se nenhum e-mail existir
    • 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 seu e-mail como 'alice@company.com' e a preferência dietética como 'Vegetarian'
    • Crie um convidado chamado 'Bob', defina apenas seu e-mail como 'bob@email.org' (deixe a preferência dietética como nula)
    • Crie um convidado chamado 'Charlie' (deixe tanto o e-mail quanto a preferência dietética como nulos)
    • Chame assignDefaultDiet() em todos os três convidados
    • Para cada convidado em ordem, chame printBadge(), 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 dietética de Alice permanece 'Vegetarian' porque ??= só atribui quando o valor é nulo, enquanto Bob e Charlie recebem a dieta padrão 'Standard' atribuída.

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

Folha de consulta

Dart fornece operadores null-aware para trabalhar com valores anuláveis de forma mais concisa.

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);  // Still Anonymous (wasn't null)

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

String? city = user?.address?.city;  // Safe even if user or address is null

Esses operadores podem ser combinados:

String greeting = user?.name ?? 'Stranger';
// If user is null OR user.name is null, use 'Stranger'

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