Суммирование списка с помощью fold
Часть раздела Управление состоянием путешествия по Flutter на Coddy. Урок 8 из 27.
Для списка расходов нужно получить общую сумму. Можно пройтись по списку в цикле и сложить значения, но у списка есть метод, который делает именно это: fold. Он проходит по списку, перенося одно значение от элемента к элементу:
double total = expenses.fold(0.0, (sum, e) => sum + e.amount);Читайте это так: начните с 0.0. Для каждого расхода e новая sum — это старая sum плюс e.amount. Когда список закончится, последняя sum и будет результатом. Для 3.5 и 12 это 0.0, затем 3.5, затем 15.5.
Функция должна возвращать новую сумму. Если она возвращает только e.amount, на каждом шаге забывается предыдущее значение, и «общая сумма» оказывается последней ценой.
Сам список может измениться: expenses.add(...) внутри setState добавляет ещё один элемент, и при следующей сборке суммируется уже новый список.
Задание
ЛегкоВ строке с итогом всегда указано $0.00. Вычисли его вместо этого:
- Задай
totalс помощьюexpenses.fold, складываяamountкаждой траты.
В строке уже отображается сумма с 2 знаками после запятой, поэтому там должно быть Total: $15.50, а сумма будет увеличиваться, когда ты добавишь перекус.
Попробуйте сами
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'),
),
],
),
),
);
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Управление состоянием
2Dart для моделей
Методы ваших классовГеттеры в ваших классахСделайте поле приватнымСуммирование списка с помощью foldПотренируйтесь самостоятельно: Онлайн-компилятор Flutter