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}