Somma una lista con fold
Fa parte della sezione Gestione dello stato del percorso Flutter di Coddy. Lezione 8 di 27.
Un elenco di spese ha bisogno di un totale. Potresti usare un ciclo e sommare, ma un elenco ha un metodo che fa esattamente questo: fold. Scorre l’elenco, portando con sé un valore da un elemento all’altro:
double total = expenses.fold(0.0, (sum, e) => sum + e.amount);Leggilo così: parti da 0.0. Per ogni spesa e, il nuovo sum è il vecchio sum più e.amount. Quando l’elenco è terminato, l’ultimo sum è il risultato. Per 3.5 e 12, i valori sono 0.0, poi 3.5, poi 15.5.
La funzione deve restituire la nuova somma. Se restituisce solo e.amount, a ogni passaggio dimentica quello precedente e il «totale» è l’ultimo prezzo.
L’elenco stesso può cambiare: expenses.add(...) dentro setState ne aggiunge un altro elemento e la build successiva somma il nuovo elenco.
Sfida
FacileLa riga del totale indica sempre $0.00. Calcolalo invece:
- Imposta
totalconexpenses.fold, sommando l’amountdi ogni spesa.
La riga lo mostra già con 2 decimali, quindi dovrebbe indicare Total: $15.50 e aumentare quando aggiungi uno snack.
Provalo tu
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class Expense {
Expense({required this.name, required this.amount});
final String name;
final double amount;
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
debugShowCheckedModeBanner: false,
home: HomePage(),
);
}
}
class HomePage extends StatefulWidget {
const HomePage({super.key});
@override
State<HomePage> createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> {
final List<Expense> expenses = [
Expense(name: 'Coffee', amount: 3.5),
Expense(name: 'Lunch', amount: 12),
];
@override
Widget build(BuildContext context) {
double total = 0;
return Scaffold(
appBar: AppBar(title: const Text('Expenses')),
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
for (final e in expenses) Text('${e.name}: \$${e.amount.toStringAsFixed(2)}'),
const SizedBox(height: 16),
Text('Total: \$${total.toStringAsFixed(2)}', style: const TextStyle(fontSize: 28)),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
setState(() {
expenses.add(Expense(name: 'Snack', amount: 2.25));
});
},
child: const Text('Add a snack'),
),
],
),
),
);
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Gestione dello stato
2Dart per i modelli
Metodi nelle tue classiGetter nelle tue classiMantieni privato un campoSomma una lista con foldEsercitati da solo: Compilatore Flutter online