Operadores de propagación en Dart

Operadores de propagación Spread operators ... y ...?

Evalúa una expresión de colección, desempaqueta todos sus elementos y los extrae para insertarlos dentro de otro literal de colección (lista, Set, Map)

No forman parte de las expresiones de operadores: ... y ...? no son operadores en el sentido tradicional, sino azúcar sintáctico

Existen dos modalidades

...collection: propagación normal. La colección no puede ser null en ningún caso; si se pasa null se genera un error inmediato

...?collection: propagación segura ante valores nulos. Si la colección es null, se ignora sin lanzar ninguna excepción

Los ejemplos oficiales facilitan mucho su comprensión

void main() {
  final list1 = [1, 2, 3];
  final list2 = [0, ...list1, 4, 5];
  print(list2); // [0, 1, 2, 3, 4, 5]

  // Propagación segura para null
  List<int>? maybeList;
  final safeList = [10, ...?maybeList, 20];
  print(safeList); // [10, 20], no hay error si maybeList vale null
}Lenguaje del código: Dart (dart)

El ejemplo superior usa dos colecciones: la primera tiene tres elementos 1, 2, 3. La segunda inserta la primera colección después del valor 0 y añade posteriormente 4 y 5, obteniendo el resultado [0, 1, 2, 3, 4, 5]

El segundo caso también realiza una inserción, pero al ser maybeList null y usarse la propagación segura, no se insertan elementos, el resultado no se altera y no se produce ningún error

Ejemplo con Set

void main() {
	final set1 = {1, 2};
	final set2 = {3, ...set1, 4};
	print(set2); // {3, 1, 2, 4}
}Lenguaje del código: PHP (php)

Ejemplo con Map

void main() {
	final map1 = {'a': 1, 'b': 2};
	final map2 = {'c': 3, ...map1, 'd': 4};
	print(map2); // {c: 3, a: 1, b: 2, d: 4}
}Lenguaje del código: PHP (php)

Observaciones importantes

No se puede usar ... de forma aislada fuera de los corchetes [] ni las llaves {}

void main() {
    final list1 = [1, 2, 3];
	var arr = ...list; // Error sintáctico, solo se puede escribir dentro de un literal de colección
}Lenguaje del código: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:12: Error: Expected an identifier, but got '...'.
Try inserting an identifier before '...'.
        var arr = ...list; // Error sintáctico, solo se puede escribir dentro de un literal de colección
                  ^^^
bin/firstdart.dart:3:12: Error: Expected ';' after this.
        var arr = ...list; // Error sintáctico, solo se puede escribir dentro de un literal de colección
                  ^^^
bin/firstdart.dart:3:15: Error: Undefined name 'list'.
        var arr = ...list; // Error sintáctico, solo se puede escribir dentro de un literal de colecciónLenguaje del código: PHP (php)

Si usas ... directamente sobre un valor null se produce un error en tiempo de ejecución. Si una variable puede ser null, debes utilizar obligatoriamente ...?

void main() {
	List<int>? list = null;
	var res = [...list]; // Provoca un error
	var resSafe = [...?list]; // Funciona correctamente
}Lenguaje del código: PHP (php)
D:\dartdemo\firstdart>dart run
Building package executable...
Failed to build firstdart:firstdart:
bin/firstdart.dart:3:16: Error: An expression whose value can be 'null' must be null-checked before it can be dereferenced.
        var res = [...list]; // Provoca un errorLenguaje del código: PHP (php)

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *