Flutter构建Widget报错:预期类型为double却获取到Null,求帮助
TypeErrorImpl错误:预期'double'类型但实际获取'Null'的原因与解决方法
错误原因
你的代码里通过(data['total'] as double)和(data['amount'] as double)做了强制类型转换,但groupedTransactionValues列表中存在某个map对象,它的'total'或'amount'键对应的值是null。Dart不允许直接将null强制转为double,因此触发类型错误。
另外,如果totalSpending是可空的double?类型,当它为null时,totalSpending == 0.0会返回false,进而执行(data['amount'] as double) / totalSpending的计算,此时若data['amount']是null,同样会引发错误。
解决方法
1. 安全处理类型转换,避免null崩溃
不要直接用as double强制转换,改用空合并运算符??为null值设置默认的0.0:
- 将
(data['total'] as double)改为(data['total'] as double?) ?? 0.0 - 将
(data['amount'] as double)改为(data['amount'] as double?) ?? 0.0
2. 确保totalSpending的安全性
如果totalSpending是可空类型,先处理它的null情况,避免后续计算出问题:
final safeTotalSpending = totalSpending ?? 0.0;
之后用safeTotalSpending代替原变量进行判断和除法计算。
3. 从源头避免null值
检查生成groupedTransactionValues的代码逻辑,确保每个分组的map都正确初始化'total'和'amount'字段,比如在统计无交易日期时,主动给这两个字段赋值0.0,而不是让它们为null。
修改后的完整代码示例
Widget build(BuildContext context) { // 处理totalSpending的null情况 final safeTotalSpending = totalSpending ?? 0.0; return Card( elevation: 6, margin: EdgeInsets.all(15), child: Row( mainAxisAlignment: MainAxisAlignment.spaceAround, children: groupedTransactionValues.map((data) { // 安全解析各字段,null时用0.0兜底 final day = data['day'] as String; final total = (data['total'] as double?) ?? 0.0; final amount = (data['amount'] as double?) ?? 0.0; return ChartBar( day, total, safeTotalSpending == 0.0 ? 0.0 : amount / safeTotalSpending, ); }).toList(), ), ); }
内容的提问来源于stack exchange,提问作者Dan69
相关产品推荐
相关产品推荐

