Skip to Content
FlutterLezione 3 Gestione Dello Stato3.6 - Approfondimenti su Dart

Approfondimenti su Dart

Collezioni

Dart offre diversi tipi di collezioni come List, Map e Set, insieme agli operatori spread e collection if, molto utili nella costruzione delle interfacce in Flutter.

Liste

Una lista è una sequenza ordinata di elementi. Dart fornisce liste dinamiche, cioè che possono crescere o ridursi durante l’esecuzione del programma.

void main() { List<int> numeri = [1, 2, 3]; numeri.add(4); print(numeri); // Output: [1, 2, 3, 4] }

Metodi statici utili

List.generate()

Crea una lista popolata dinamicamente in base a una funzione generatrice.

List<String> giorni = List.generate(7, (i) => 'Giorno ${i + 1}'); print(giorni); // [Giorno 1, Giorno 2, ..., Giorno 7]

List.filled()

Crea una lista di lunghezza fissa con un valore predefinito.

List<int> zeri = List.filled(5, 0); print(zeri); // [0, 0, 0, 0, 0]

Operatori Avanzati sulle Liste

Spread operator (...)

Permette di inserire tutti gli elementi di una lista all’interno di un’altra.

List<int> lista1 = [1, 2]; List<int> lista2 = [0, ...lista1, 3]; print(lista2); // Output: [0, 1, 2, 3]

Collection if

Consente di aggiungere elementi in modo condizionale.

bool aggiungi = true; List<String> elementi = [ "Base", if (aggiungi) "Aggiuntivo" ]; print(elementi); // Output: [Base, Aggiuntivo]

Collection for

Genera elementi iterando su un’altra collezione.

List<int> base = [1, 2, 3]; List<int> quadrati = [for (var x in base) x * x]; print(quadrati); // Output: [1, 4, 9]

Metodi comuni delle Liste

add()

Aggiunge un singolo elemento in fondo alla lista. Modifica la lista esistente.

List<int> numeri = [1, 2, 3]; numeri.add(4); print(numeri); // [1, 2, 3, 4]

addAll()

Aggiunge una collezione intera di elementi alla fine della lista. Utile per concatenare liste.

List<int> numeri = [1, 2]; numeri.addAll([3, 4]); print(numeri); // [1, 2, 3, 4]

insert()

Inserisce un elemento in una posizione specifica. Gli elementi successivi vengono spostati in avanti.

List<String> lettere = ['a', 'c']; lettere.insert(1, 'b'); print(lettere); // [a, b, c]

insertAll()

Inserisce una lista di elementi a partire da un indice specificato.

numeri.insertAll(2, [8, 9]);

remove()

Rimuove la prima occorrenza dell’elemento specificato, se presente. Non fa nulla se l’elemento non esiste.

List<int> numeri = [1, 2, 3, 2]; numeri.remove(2); print(numeri); // [1, 3, 2]

removeAt()

Rimuove l’elemento nella posizione data. Genera errore se l’indice non è valido.

numeri.removeAt(0);

removeLast()

Rimuove l’ultimo elemento della lista.

numeri.removeLast();

removeRange()

Rimuove un intervallo continuo di elementi tra due indici.

numeri.removeRange(0, 2);

removeWhere()

Rimuove tutti gli elementi che soddisfano una condizione.

numeri.removeWhere((n) => n.isEven);

clear()

Elimina tutti gli elementi dalla lista, rendendola vuota.

numeri.clear();

contains()

Restituisce true se la lista contiene l’elemento indicato.

numeri.contains(2);

indexOf()

Restituisce l’indice della prima occorrenza di un elemento, o -1 se non esiste.

numeri.indexOf(4);

lastIndexOf()

Restituisce l’indice dell’ultima occorrenza di un elemento.

numeri.lastIndexOf(2);

indexWhere()

Restituisce l’indice del primo elemento che soddisfa una condizione.

int i = numeri.indexWhere((n) => n > 5);

lastIndexWhere()

Restituisce l’indice dell’ultima occorrenza che soddisfa una condizione.

int i = numeri.lastIndexWhere((n) => n > 5);

elementAt()

Restituisce l’elemento all’indice specificato.

var x = numeri.elementAt(1);

getRange()

Restituisce un sottoinsieme come iterable.

var sub = numeri.getRange(1, 3);

setAll()

Sostituisce un intervallo con nuovi elementi.

numeri.setAll(0, [100, 200]);

fillRange()

Riempie un intervallo con un valore specifico.

numeri.fillRange(0, 2, 9);

replaceRange()

Sostituisce un intervallo con altri elementi.

numeri.replaceRange(0, 2, [7, 8]);

sort()

Ordina gli elementi della lista in ordine crescente. Può accettare una funzione di confronto personalizzata.

List<int> numeri = [4, 1, 3]; numeri.sort(); print(numeri); // [1, 3, 4]

reversed

Restituisce un iterable con gli elementi invertiti.

var inversa = numeri.reversed;

map()

Applica una funzione a ogni elemento e restituisce un nuovo Iterable. Utile per trasformazioni.

List<int> numeri = [1, 2, 3]; var risultato = numeri.map((n) => n * 10); print(risultato.toList()); // [10, 20, 30]

where()

Filtra gli elementi secondo una condizione booleana, restituendo solo quelli che la soddisfano.

List<int> numeri = [1, 2, 3, 4]; var pari = numeri.where((n) => n % 2 == 0); print(pari.toList()); // [2, 4]

any() / every()

Verifica condizioni su almeno uno o tutti gli elementi.

numeri.any((n) => n > 5); numeri.every((n) => n > 0);

forEach()

Itera sugli elementi.

numeri.forEach((n) => print(n));

reduce() / fold()

reduce() combina gli elementi in sequenza partendo dal primo. fold() parte da un valore iniziale e applica una funzione di accumulo.

List<int> numeri = [1, 2, 3]; print(numeri.reduce((a, b) => a + b)); // 6 print(numeri.fold(10, (acc, n) => acc + n)); // 16

join()

Unisce gli elementi della lista in una stringa usando un separatore.

List<String> lettere = ['a', 'b', 'c']; print(lettere.join('-')); // "a-b-c"

sublist()

Restituisce una nuova lista contenente un sottoinsieme della lista originale.

List<int> numeri = [10, 20, 30, 40]; var parte = numeri.sublist(1, 3); print(parte); // [20, 30]

Mappe

Una mappa è una collezione di coppie chiave-valore in cui ogni chiave è univoca e associata a un valore. Le mappe sono ideali per rappresentare strutture di dati come dizionari, configurazioni o JSON decodificati.

void main() { Map<String, int> mappa = { 'uno': 1, 'due': 2, }; mappa['tre'] = 3; print(mappa); // Output: {uno: 1, due: 2, tre: 3} }

Metodi comuni delle Mappe

[] Assegnazione diretta

Aggiunge o aggiorna un valore per una chiave.

mappa['quattro'] = 4;

remove()

Rimuove una chiave e il relativo valore.

mappa.remove('uno');

containsKey() / containsValue()

Verifica se una chiave o un valore è presente nella mappa.

mappa.containsKey('due'); mappa.containsValue(3);

forEach()

Itera su tutte le coppie chiave-valore.

mappa.forEach((chiave, valore) { print('$chiave: $valore'); });

keys / values

Restituisce una vista delle chiavi o dei valori.

print(mappa.keys); // (uno, due, tre) print(mappa.values); // (1, 2, 3)

update()

Aggiorna il valore associato a una chiave.

mappa.update('due', (valore) => valore + 10);

putIfAbsent()

Aggiunge una chiave solo se non esiste già.

mappa.putIfAbsent('cinque', () => 5);

clear()

Rimuove tutte le coppie dalla mappa.

mappa.clear();

isEmpty / isNotEmpty

Verifica se la mappa è vuota.

print(mappa.isEmpty); print(mappa.isNotEmpty);

Set

Un Set è una collezione di elementi non ordinata e senza duplicati. È particolarmente utile quando serve garantire l’unicità degli elementi.

void main() { Set<String> lettere = {'a', 'b', 'c'}; lettere.add('d'); lettere.add('a'); // Non viene aggiunto perché già presente print(lettere); // Output: {a, b, c, d} }

Metodi comuni dei Set

add()

Aggiunge un nuovo elemento, se non è già presente.

lettere.add('e');

addAll()

Aggiunge tutti gli elementi di un’altra collezione.

lettere.addAll(['f', 'g']);

remove()

Rimuove un elemento, se esiste.

lettere.remove('b');

contains()

Verifica se un elemento è presente nel set.

print(lettere.contains('a'));

forEach()

Itera su tutti gli elementi del set.

lettere.forEach((elemento) => print(elemento));

clear()

Rimuove tutti gli elementi del set.

lettere.clear();

isEmpty / isNotEmpty

Verifica se il set è vuoto o contiene elementi.

print(lettere.isEmpty); print(lettere.isNotEmpty);

Operazioni tra Set

union()

Restituisce un nuovo set con tutti gli elementi dei due set.

final a = {1, 2, 3}; final b = {3, 4, 5}; print(a.union(b)); // {1, 2, 3, 4, 5}

intersection()

Restituisce un nuovo set con solo gli elementi comuni.

print(a.intersection(b)); // {3}

difference()

Restituisce un nuovo set con gli elementi presenti solo nel primo.

print(a.difference(b)); // {1, 2}