Dart: Variables, Tipos y Null Safety
var, final, const, y los operadores ?, !, ??, ??= que hacen a Dart un lenguaje "null-safe"
🎯 Demo 1: Operadores de Null Safety
Resultado:
Prueba con y sin valor
String? nombre = obtenerNombre(); // puede ser null
String saludo = nombre ?? 'Invitado'; // si nombre es null, usa 'Invitado'
int longitud = nombre?.length ?? 0; // ?. evita el error si nombre es null
// nombre! le dice al compilador "confía en mí, no es null" — si SÍ lo es, explota en runtime:
print(nombre!.length); // Unhandled exception: Null check operator used on a null value
💡 Null safety en Dart
Desde Dart 2.12, un tipo como String NUNCA puede ser null — para permitirlo hay que escribir String? explícitamente. Esto elimina en tiempo de compilación una clase entera de errores ("null pointer") que en otros lenguajes solo se detectan en producción.
🔒 Demo 2: var vs final vs const
Resultado:
Intenta reasignar una variable final
var edad = 25; // el TIPO se infiere (int) pero la variable sí se puede reasignaredad = 26; // correcto
final colorFavorito = 'azul'; // se asigna una vez, ya no se puede cambiarcolorFavorito = 'verde'; // Error de compilación
const pi = 3.14159; // como final, pero el valor debe conocerse en tiempo de COMPILACIÓN
💡 ¿final o const?
Usa const cuando el valor es una constante conocida de antemano (ej. un número fijo). Usa final cuando el valor se calcula en tiempo de ejecución pero no debe cambiar después (ej. la hora actual, un resultado de una función).
🎯 Conceptos Clave
var / final / const
var: reasignable, tipo inferidofinal: se asigna una vezconst: constante en compilación
Null safety
Tipo?permite null,Tipono??valor por defecto?.acceso seguro
late
- Promete inicializar más tarde
- Error si se lee antes de asignar
💪 Ejercicio Práctico
Practica null safety
- Declara
int? edad;sin valor inicial y usaedad ??= 18;para asignarle un valor solo si sigue siendo null. - Crea una variable
late String apellido;y asígnale un valor antes de usarla por primera vez. - Escribe una función que reciba
String? textoy devuelva su longitud usando?.y??en una sola línea.
Solución 1
int? edad;
edad ??= 18; // como edad era null, ahora edad vale 18
Solución 2
late String apellido;
apellido = 'Gómez'; // debe asignarse antes del primer uso
Solución 3
int longitudDe(String? texto) => texto?.length ?? 0;