Flutter报错:在Null上调用方法'+',个人理财应用问题排查
问题排查与解决方案
嘿,我帮你找到了这两个问题的根源,咱们一步步来解决:
1. 为什么会出现 NoSuchMethodError: The method '+' was called on Null?
这个错误的核心是变量未初始化:你声明了 double totalSum; 但没有给它赋值,Dart 里未初始化的非空类型变量默认值是 null。当你添加交易后,循环里执行 totalSum+= recentTransactions[i].amount 时,相当于在 null 上调用 + 运算符,这就触发了报错。
解决办法:
给 totalSum 初始化一个默认值 0.0,修改这一行:
double totalSum = 0.0;
这样一开始总和就是0,后续累加交易金额时就不会有null的问题了。
2. 为什么初始状态没有打印空列表?
你提到“本应打印空列表”,其实是对 List.generate(7, ...) 的逻辑误解:这个方法会强制生成7个元素的列表,不管 recentTransactions 是否为空。初始时没有交易,之前因为没初始化totalSum,每个元素的 amount 会是 null,所以打印出来的是包含7个 {'day': ..., 'amount': null} 的列表,而非空列表。
两种解决方向:
方向一:保留7个条目,amount显示0而非null
只需要按上面的方法初始化totalSum = 0.0,这样即使没有交易,每个日期的金额都是0.0,打印出来的列表就不会有null值。方向二:没有交易时返回空列表
在getter开头添加判断,当没有交易时直接返回空列表:List<Map<String,Object>> get groupedTransactionValues{ // 没有交易时返回空列表 if(recentTransactions.isEmpty){ return []; } // 原来的List.generate代码... }
修改后的完整代码(以方向一为例)
import 'package:demo_app/models/transaction.dart'; import 'package:flutter/material.dart'; import 'package:intl/intl.dart'; class Chart extends StatelessWidget { final List<Transaction> recentTransactions; Chart(this.recentTransactions) ; List<Map<String,Object>> get groupedTransactionValues{ return List.generate(7, (index){ final weekDay = DateTime.now().subtract(Duration(days: index)); // 初始化totalSum为0.0,避免null double totalSum = 0.0; for(var i =0 ; i<recentTransactions.length;i++){ final tx = recentTransactions[i]; if(tx.date.day == weekDay.day && tx.date.month == weekDay.month && tx.date.year == weekDay.year){ totalSum += tx.amount; } } print(DateFormat.E().format(weekDay)); print(totalSum); return{'day': DateFormat.E().format(weekDay) , 'amount': totalSum }; }); } @override Widget build(BuildContext context) { print(groupedTransactionValues); return Card( elevation: 5, margin: EdgeInsets.all(20), child: Row(children: <Widget>[ ],), ); } }
现在你再运行代码:
- 初始状态下,会打印7个包含日期和0.0的map(或者空列表,取决于你选的方向);
- 添加交易后,累加逻辑正常,不会再出现NoSuchMethodError报错。
内容的提问来源于stack exchange,提问作者Md. Arian Rahman
相关产品推荐
相关产品推荐

