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
...listacândlistapoate finull: eroare de tip. Folosește...?lista.- Să crezi că
[...a]copiază și obiectele: este o copie superficială, elementele sunt aceleași obiecte. {...lista}creează unSet, 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.