spread (…) în Dart

Operatorul ... pune toate elementele unei colecții în interiorul altei liste, set sau map.

Sintaxă
[...lista1, ...lista2, element]
{...set1, ...set2}
{...map1, 'cheie': valoare}
[...?listaPosibilNula]          // sare peste null

Ce face spread (...)

Într-un literal de colecție ([ ], { }), ...colectie inserează toate elementele colecției în locul acela. Astfel poți combina liste, adăuga elemente la început și la sfârșit sau copia un map, într-o singură expresie.

...? este varianta null-aware: dacă valoarea este null, nu se inserează nimic, în loc să apară o eroare.

Rezultatul este întotdeauna o colecție nouă; colecțiile originale rămân neschimbate. La map-uri, dacă o cheie apare de mai multe ori, rămâne ultima valoare.

Exemple

Exemplul 1: Combinarea listelor

Elevii din două clase, plus profesorul la început, într-o listă nouă.

void main() {
  final claseA = ['Ana', 'Bogdan'];
  final claseB = ['Carmen', 'Dan', 'Elena'];
  final excursie = ['prof. Ionescu', ...claseA, ...claseB];
  print(excursie);
  print('${excursie.length} participanți');
}

Rezultat

[prof. Ionescu, Ana, Bogdan, Carmen, Dan, Elena]
6 participanți

Exemplul 2: Map-uri: valori implicite suprascrise

Setările utilizatorului vin după cele implicite, așa că le înlocuiesc pe cele cu aceeași cheie.

void main() {
  const implicite = {'limba': 'ro', 'tema': 'luminoasă', 'notificari': true};
  final utilizator = {'tema': 'întunecată'};

  final finale = {...implicite, ...utilizator};
  print(finale);
  print(implicite);
}

Rezultat

{limba: ro, tema: întunecată, notificari: true}
{limba: ro, tema: luminoasă, notificari: true}

Exemplul 3: …? pentru valori care pot lipsi

Unii clienți nu au produse în coș (null); ...? îi sare fără eroare.

List<String>? cos(String client) => {
      'Ana': ['carte', 'pix'],
      'Radu': ['caiet'],
    }[client];

void main() {
  final toate = [
    ...?cos('Ana'),
    ...?cos('Mara'),
    ...?cos('Radu'),
  ];
  print(toate);
}

Rezultat

[carte, pix, caiet]

Greșeli frecvente

  • ...lista când lista poate fi null: eroare de tip. Folosește ...?lista.
  • Să crezi că [...a] copiază și obiectele: este o copie superficială, elementele sunt aceleași obiecte.
  • {...lista} creează un Set, nu o listă: duplicatele dispar.

Comenzi înrudite

  • collection if și for: if și for direct în interiorul unei liste, set sau map, pentru a construi colecția dintr-o singură expresie.
  • cascade (..): Operatorul .. face mai multe operații pe același obiect, una după alta, fără să repeți numele lui.
  • ?. și ?..: Accesul condiționat: ?. apelează o metodă doar dacă obiectul nu este null, altfel dă null.