Suma una lista con fold
Parte de la sección Gestión del estado del Journey de Flutter de Coddy. Lección 8 de 27.
Una lista de gastos necesita un total. Podrías recorrerla y sumar, pero una lista tiene un método que hace exactamente esto: fold. Recorre la lista y va llevando un valor de un elemento al siguiente:
double total = expenses.fold(0.0, (sum, e) => sum + e.amount);Léelo así: empieza en 0.0. Por cada gasto e, el nuevo sum es el antiguo sum más e.amount. Cuando termina la lista, el último sum es el resultado. Para 3.5 y 12, eso es 0.0, después 3.5 y después 15.5.
La función debe devolver la nueva suma. Si devuelve solo e.amount, cada paso olvida el anterior y el «total» es el último precio.
La lista en sí puede cambiar: expenses.add(...) dentro de setState agrega uno más, y la siguiente compilación suma la nueva lista.
Desafío
FácilLa línea del total siempre muestra $0.00. Calcúlalo en su lugar:
- Establece
totalconexpenses.fold, sumando elamountde cada gasto.
La línea ya lo muestra con 2 decimales, así que debería mostrar Total: $15.50 y aumentar cuando agregues un tentempié.
Pruébalo tú mismo
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'),
),
],
),
),
);
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Gestión del estado
2Dart para modelos
Métodos en tus clasesGetters en tus clasesMantén un campo privadoSuma una lista con foldPractica por tu cuenta: Compilador de Flutter online