Menu
Coddy logo textTech

Operadores Null-aware

Parte de la sección Programación Orientada a Objetos del Journey de Dart de Coddy. Lección 27 de 110.

Más allá de ?. y !, Dart proporciona operadores adicionales que hacen que trabajar con valores que pueden ser nulos sea más conciso. Estos operadores null-aware te ayudan a escribir código más limpio al tratar con posibles valores nulos.

El operador de coalescencia nula ?? devuelve el valor de la izquierda si no es nulo; de lo contrario, devuelve el valor de la derecha:

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

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

El operador de asignación nula ??= asigna un valor solo si la variable es actualmente nula:

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

username ??= 'NewName';
print(username);  // Sigue siendo Anonymous (no era nulo)

Puedes encadenar el operador de acceso consciente de nulos ?. para propiedades anidadas:

String? city = user?.address?.city;  // Seguro incluso si user o address es null

Estos operadores se combinan bien entre sí. Por ejemplo, podrías acceder a una propiedad que admite valores nulos y proporcionar un valor predeterminado:

String greeting = user?.name ?? 'Stranger';
// Si user es null O user.name es null, usa 'Stranger'

El uso de estos operadores mantiene su código legible mientras mantiene la seguridad contra nulos en todo su programa.

challenge icon

Desafío

Fácil

Construyamos un sistema de registro de invitados que demuestre cómo los operadores conscientes de valores nulos pueden hacer que tu código sea más limpio al manejar información opcional.

Organizarás tu código en dos archivos:

  • guest.dart: Define una clase Guest que represente a alguien que asiste a un evento. Algunos invitados proporcionan todos sus datos, mientras que otros solo dan la información básica. Tu clase debe tener:
    • Un String name no anulable: todo invitado debe tener un nombre
    • Un String? email anulable: no todos proporcionan un correo electrónico
    • Un String? dietaryPreference anulable: algunos invitados no especifican sus necesidades alimentarias
    • Un constructor que reciba name como parámetro obligatorio
    • Un método getDisplayEmail() que devuelva el correo electrónico si está disponible, o 'No email provided' mediante el operador ??
    • Un método assignDefaultDiet() que establezca dietaryPreference en 'Standard' solo si actualmente es null, mediante el operador ??=
    • Un método getEmailDomain() que devuelva la longitud del correo electrónico usando ?., o null si no existe ningún correo electrónico
    • Un método printBadge() que imprima la información de la credencial del invitado
  • main.dart: Importa tu clase de invitado y registra a tres invitados con distintos niveles de información:
    • Crea un invitado llamado 'Alice', establece su correo electrónico en 'alice@company.com' y su preferencia alimentaria en 'Vegetarian'
    • Crea un invitado llamado 'Bob', establece únicamente su correo electrónico en 'bob@email.org' (deja la preferencia alimentaria como null)
    • Crea un invitado llamado 'Charlie' (deja tanto el correo electrónico como la preferencia alimentaria como null)
    • Llama a assignDefaultDiet() en los tres invitados
    • Para cada invitado, en orden, llama a printBadge() y después imprime Email length: [result] usando getEmailDomain()

El método printBadge() debe imprimir con este formato:

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

Observa cómo la preferencia alimentaria de Alice sigue siendo 'Vegetarian' porque ??= solo asigna un valor cuando el valor es null, mientras que a Bob y Charlie se les asigna la dieta predeterminada 'Standard'.

Salida 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

Pruébalo tú mismo

import 'guest.dart';

void main() {
  // TODO: Crea un invitado llamado 'Alice'
  // Establece su correo electrónico a 'alice@company.com'
  // Establece su preferencia dietética a 'Vegetarian'

  // TODO: Crea un invitado llamado 'Bob'
  // Establece solo su correo electrónico a 'bob@email.org'
  // Deja la preferencia dietética como null

  // TODO: Crea un invitado llamado 'Charlie'
  // Deja tanto el correo electrónico como la preferencia dietética como null

  // TODO: Llama a assignDefaultDiet() en los tres invitados

  // TODO: Para cada invitado en orden (Alice, Bob, Charlie):
  // - Llama a printBadge()
  // - Imprime 'Email length: [result]' usando getEmailDomain()
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Programación Orientada a Objetos

Practica por tu cuenta: Compilador de Dart online