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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 17:46:08