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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:03:17