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:

nombre
null
nombre ?? 'Invitado'
Invitado
nombre?.length ?? 0
0

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:

final colorFavorito = 'azul';
Declarado correctamente. Prueba a reasignarlo →

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 inferido
  • final: se asigna una vez
  • const: constante en compilación

Null safety

  • Tipo? permite null, Tipo no
  • ?? valor por defecto
  • ?. acceso seguro

late

  • Promete inicializar más tarde
  • Error si se lee antes de asignar

💪 Ejercicio Práctico

Practica null safety

  1. Declara int? edad; sin valor inicial y usa edad ??= 18; para asignarle un valor solo si sigue siendo null.
  2. Crea una variable late String apellido; y asígnale un valor antes de usarla por primera vez.
  3. Escribe una función que reciba String? texto y 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;