为何Flutter函数设置默认参数为当前年份时出现报错?
问题解决:Dart函数默认参数及代码逻辑修正
核心错误:默认参数不能用运行时计算值
Dart要求可选命名参数的默认值必须是编译时常量,DateTime.now().year是运行时才会计算的值,没法直接作为默认参数设置,这就是你遇到设计时错误的原因。
修正后的完整代码
Map<String, dynamic> monthBalanceCard({required int month, int? year}) { // 处理年份默认值:未传入则使用当前年份 final targetYear = year ?? DateTime.now().year; // 筛选指定年月的支出交易 final expenseTransactions = _allTransactions .where((element) => element.isexpense) .where((element) => element.date.year == targetYear && element.date.month == month); // 筛选指定年月的收入交易(修正判断逻辑,从赋值改为相等判断) final incomeTransactions = _allTransactions .where((element) => element.isexpense == false) .where((element) => element.date.year == targetYear && element.date.month == month); // 计算支出总额 double expenseTotal = expenseTransactions.fold( 0, (previousValue, element) => previousValue + element.amount); // 计算收入总额(修正数据源,从支出列表改为收入列表) double incomeTotal = incomeTransactions.fold( 0, (previousValue, element) => previousValue + element.amount); // 修正余额计算逻辑:收入减支出才符合常规余额定义 double balance = incomeTotal - expenseTotal; return { 'Expense': expenseTotal, 'Income': incomeTotal, 'Balance': balance, }; }
关键修正点说明
- 默认参数处理:将
year设为可空类型int?,在函数内部通过??运算符设置默认值,避开Dart对默认参数必须是编译时常量的限制。 - 逻辑判断错误:把
element.isexpense = false的赋值操作改为element.isexpense == false的相等判断,正确筛选收入交易。 - 计算数据源错误:收入总额计算时,将数据源从
expenseTransactions改为incomeTransactions,避免计算结果错误。 - 余额逻辑修正:将
expenseTotal - incomeTotal改为incomeTotal - expenseTotal,符合“余额=收入-支出”的常规逻辑。 - 性能优化:去掉不必要的
toList()调用,直接链式使用where筛选,避免提前创建列表占用额外内存。
内容的提问来源于stack exchange,提问作者user22362195
相关产品推荐
相关产品推荐

