Menu
CoddyTech

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.

challenge icon

Sfida

Facile

La riga del totale indica sempre $0.00. Calcolalo invece:

  • Imposta total con expenses.fold, sommando l’amount di 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'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gestione dello stato

Esercitati da solo: Compilatore Flutter online