You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何对交易数据按类别分组并统计总金额

问题描述

现有Transaction类模型,对应的数据集如下:

List<Transaction> transactionlist=[
  Transaction(category: 'Food', amount: 100.00),
  Transaction(category: 'Food', amount: 200.00),
  Transaction(category: 'Shopping', amount: 1000.00),
  Transaction(category: 'Shopping', amount: 2000.00),
  Transaction(category: 'Food', amount: 300.00),
  Transaction(category: 'Provision', amount: 500.00),
];

已创建ShowCategoryStatus无状态组件,需要在其amountByCategory getter中编写代码,返回按类别分组并包含对应总金额的Map列表,格式要求如下:

[
  {
    'Category':'Food','total':600
  },
  {
    'Category':'Shopping','total':3000.00
  },
  {
    'Category':'Provision','total':500
  }
]

请问该如何实现?


实现方案

首先假设Transaction类定义如下(若已有可忽略):

class Transaction {
  final String category;
  final double amount;

  Transaction({required this.category, required this.amount});
}

方式一:手动遍历实现

在ShowCategoryStatus组件中直接通过遍历完成分组与金额累加:

class ShowCategoryStatus extends StatelessWidget {
  final List<Transaction> transactionList;

  const ShowCategoryStatus({super.key, required this.transactionList});

  List<Map<String, dynamic>> get amountByCategory {
    // 临时存储每个类别的总金额
    final Map<String, double> categoryTotalMap = {};

    for (final transaction in transactionList) {
      if (categoryTotalMap.containsKey(transaction.category)) {
        // 类别已存在,累加金额
        categoryTotalMap[transaction.category] =
            categoryTotalMap[transaction.category]! + transaction.amount;
      } else {
        // 类别不存在,初始化金额
        categoryTotalMap[transaction.category] = transaction.amount;
      }
    }

    // 将Map转换为要求的列表格式
    return categoryTotalMap.entries.map((entry) {
      return {
        'Category': entry.key,
        'total': entry.value,
      };
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    // 组件构建逻辑
    return Container();
  }
}

方式二:利用集合工具简化代码

借助Dart官方的collection包中的groupBy方法,减少手动遍历代码:

  1. 先在pubspec.yaml中添加依赖:
dependencies:
  collection: ^1.17.2
  1. 修改amountByCategory getter实现:
import 'package:collection/collection.dart';

class ShowCategoryStatus extends StatelessWidget {
  final List<Transaction> transactionList;

  const ShowCategoryStatus({super.key, required this.transactionList});

  List<Map<String, dynamic>> get amountByCategory {
    // 按category分组
    final groupedTransactions = groupBy(transactionList, (Transaction t) => t.category);

    // 计算每组总金额并转换格式
    return groupedTransactions.entries.map((entry) {
      final total = entry.value.fold(0.0, (sum, transaction) => sum + transaction.amount);
      return {
        'Category': entry.key,
        'total': total,
      };
    }).toList();
  }

  @override
  Widget build(BuildContext context) {
    // 组件构建逻辑
    return Container();
  }
}

内容的提问来源于stack exchange,提问作者Irfan Ganatra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 23:11:00