Lección 15 · 15 de 20
Seguridad frente a null · Dart
Entienda la seguridad frente a null de Dart: tipos con ?, los operadores ??, ?., ! y ??=, y cómo un if != null convierte el tipo.

`null` significa «sin valor». En Dart, un String nunca puede ser null; si una variable puede quedarse sin valor, su tipo lleva `?`: String? nickname; empieza siendo null. Esta seguridad frente a null hace que Dart avise antes de ejecutar si se usa algo que podría faltar.
La función findEmail devuelve String? porque buscar en un mapa puede no encontrar nada. El operador `??` da un valor por defecto cuando lo de la izquierda es null: nickname ?? 'none' escribe none.
`?.` llama a un método solo si el valor no es null; si lo es, el resultado es null sin error. Marta no está en la agenda, así que marta?.toUpperCase() da null, y marta?.length ?? 0 combina los dos operadores para dar 0.
Tras comprobar if (ana != null), Dart sabe que dentro del bloque ana tiene valor y la trata como un String normal: se puede llamar a split sin más. El operador `!` dice «estoy seguro de que no es null»: emails['Luis']! da un String, pero si la clave no existiera el programa fallaría, así que úselo con cuidado.
Por último, `??=` asigna solo si la variable sigue siendo null: el primer nickname ??= 'Nana' le da valor y el segundo ya no cambia nada.
Código · main.dart
// A ? after the type means it may hold null: "no value".String? findEmail(Map<String, String> book, String name) => book[name];void main() { var emails = {'Ana': 'ana@mail.com', 'Luis': 'luis@work.org'}; // String can never be null; String? can, and starts as null. String owner = 'Ana'; String? nickname; print('Owner: $owner, nickname: $nickname'); // ?? gives a default value when the left side is null. print('Nickname: ${nickname ?? 'none'}'); // ?. calls the method only if the value is not null. String? marta = findEmail(emails, 'Marta'); print('Marta: ${marta?.toUpperCase()}'); print('Marta: ${marta?.length ?? 0} characters'); // After checking != null, Dart treats it as a plain String. String? ana = findEmail(emails, 'Ana'); if (ana != null) { print('Ana writes from ${ana.split('@')[1]}'); } // ! means "I am sure it is not null" (and fails if it is). String luis = emails['Luis']!; print('Luis: ${luis.length} characters'); // ??= gives a value only if the variable is still null. nickname ??= 'Nana'; nickname ??= 'Other'; print('Nickname now: $nickname');}Salida · dart run main.dart
Owner: Ana, nickname: null Nickname: none Marta: null Marta: 0 characters Ana writes from mail.com Luis: 13 characters Nickname now: Nana
Para recordar
String?admitenull;String, no.a ?? bdabsiaesnull.a?.metodo()danullen vez de fallar.a!afirma que no esnull(y falla si lo es).- Tras
if (a != null),aes del tipo sin?.
Ejercicio
Añada una función String? findPhone(String name) con un mapa de teléfonos y escriba, para tres nombres (uno que no esté), su teléfono o no phone usando ??.