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

Vamos a construir un sistema de registro de invitados que demuestre cómo los operadores null-aware 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 detalles completos, mientras que otros solo dan lo básico. Tu clase debe tener:
    • Un String name no nulable: cada invitado debe tener un nombre
    • Un String? email nulable: no todos proporcionan un correo electrónico
    • Un String? dietaryPreference nulable: algunos invitados no especifican necesidades dietéticas
    • Un constructor que tome name como un parámetro requerido
    • Un método getDisplayEmail() que devuelva el correo electrónico si está disponible, o 'No email provided' usando el operador ??
    • Un método assignDefaultDiet() que establezca dietaryPreference a 'Standard' solo si es actualmente nulo, usando el operador ??=
    • Un método getEmailDomain() que devuelva la longitud del correo electrónico usando ?., o null si no existe el 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 diferentes niveles de información:
    • Crea un invitado llamado 'Alice', establece su correo electrónico a 'alice@company.com' y su preferencia dietética a 'Vegetarian'
    • Crea un invitado llamado 'Bob', establece solo su correo electrónico a 'bob@email.org' (deja la preferencia dietética como nula)
    • Crea un invitado llamado 'Charlie' (deja tanto el correo electrónico como la preferencia dietética como nulos)
    • Llama a assignDefaultDiet() en los tres invitados
    • Para cada invitado en orden, llama a printBadge(), luego imprime Email length: [result] usando getEmailDomain()

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

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

Observa cómo la preferencia dietética de Alice se mantiene como 'Vegetarian' porque ??= solo asigna cuando el valor es nulo, 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

Hoja de referencia

Dart proporciona operadores sensibles a nulos para trabajar con valores que pueden ser nulos de forma más concisa.

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 sensible a nulos ??= asigna un valor solo si la variable es actualmente nula:

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

username ??= 'NewName';
print(username);  // Still Anonymous (wasn't null)

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

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

Estos operadores se pueden combinar entre sí:

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

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