Menu
CoddyTech

Суммирование списка с помощью 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 добавляет ещё один элемент, и при следующей сборке суммируется уже новый список.

challenge icon

Задание

Легко

В строке с итогом всегда указано $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'),
            ),
          ],
        ),
      ),
    );
  }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Управление состоянием

Потренируйтесь самостоятельно: Онлайн-компилятор Flutter