Flutter使用fold计算金额时报Object?无法赋值给num类型错误如何解决
问题解决:Flutter使用fold计算周总支出类型错误修复
错误根因
- 你的
groupedTrandactionValues声明的返回类型是List<Map<String, Object>>,从Map中取值时默认返回的是Object?可选类型,Dart无法直接将其识别为可运算的num类型 - 你之前尝试强制转换未生效是因为操作符优先级问题:
+运算符优先级高于as,你写的prev + element['amount'] as double会被优先执行prev + element['amount'],此时类型不匹配的错误已经触发,转换逻辑根本没有生效
额外注意:你现有代码存在两处笔误:一是类中声明的成员变量是
recentTransaction(单数),构造函数接收的是recentTransactions(复数),变量名不统一;二是groupedTrandactionValues方法的List.generate闭包没有加闭合大括号,都会导致额外编译错误。
修复方案
方案1:修改Map声明+调整转换优先级(最简单)
// 第一步:修改get方法的返回类型,用dynamic兼容实际存储的字符串、浮点数类型 List<Map<String, dynamic>> get groupedTrandactionValues { // 内部原有生成逻辑不变,补全缺失的闭包大括号即可 } // 第二步:fold逻辑加括号调整类型转换的执行顺序 double get totalSpending { return groupedTrandactionValues.fold(0.0, (prev, element) { return prev + (element['amount'] as double); }); }
方案2:空安全兼容版(避免空值崩溃)
如果担心amount可能为空,可加默认值兜底:
double get totalSpending { return groupedTrandactionValues.fold(0.0, (prev, element) { final amount = element['amount'] as double? ?? 0.0; return prev + amount; }); }
方案3:不修改原有Map声明的兼容写法
如果你不想改动groupedTrandactionValues的原有List<Map<String, Object>>声明,也可以先转成通用数值类型再运算:
double get totalSpending { return groupedTrandactionValues.fold(0.0, (prev, element) { final amount = (element['amount'] as num).toDouble(); return prev + amount; }); }
内容的提问来源于stack exchange,提问作者Mafruh
相关产品推荐
相关产品推荐

