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方法,减少手动遍历代码:
- 先在
pubspec.yaml中添加依赖:
dependencies: collection: ^1.17.2
- 修改
amountByCategorygetter实现:
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
相关产品推荐
相关产品推荐

