如何对列表中OutletExpansionAchievement模型的count字段求和(支持Double)
求和逻辑验证与优化建议
我需要对名为outletExpansionAchievementAbRhHoBarGraphList的列表中所有OutletExpansionAchievementAbRhHoBarGraphModel对象的count字段求和,结果存入全局变量sum,且求和需支持Double类型。我尝试用fold方法实现,以下是我的StreamBuilder和Model代码,请帮忙验证实现是否正确。
列表示例
outletExpansionAchievementAbRhHoBarGraphList: [ OutletExpansionAchievementAbRhHoBarGraphModel{month: 6, count: 3}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 1, count: 3}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 7, count: 2}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 2, count: 15}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 8, count: 2}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 4, count: 4}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 5, count: 5}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 3, count: 2}, OutletExpansionAchievementAbRhHoBarGraphModel{month: 9, count: 5} ]
求和示例: sum=3+3+2+15+2+4+5+2+5
我的StreamBuilder实现代码
StreamBuilder<Resource<OutletExpansionAchievementAbRhHoBarGraphListModel>>( stream: widget.bloc .outletExpansionAchievementAbRhHoBarGraphListModelPublisherStream, builder: (_, snapshot) { sum = snapshot.data?.model?.outletExpansionAchievementAbRhHoBarGraphList.fold(0.0, (sum, item) => sum! + item.count!.toDouble()); return snapshot.hasData && snapshot.data?.model.toString()!=null && snapshot.data?.model ?.outletExpansionAchievementAbRhHoBarGraphList != null && snapshot.data!.model!.outletExpansionAchievementAbRhHoBarGraphList.toString().isNotEmpty ? DisplayGraph( 'Outlet Expansion', Padding( padding: const EdgeInsets.all(8.0), child: OutletExpansionAchievementBarGraphWidget( widget.bloc, sortOutletExpansionBarGraph(snapshot.data?.model ?.outletExpansionAchievementAbRhHoBarGraphList ?? [])), ), snapshot .data ?.model ?.outletExpansionAchievementAbRhHoBarGraphList .length ?? 0, ) : SizedBox(); }, ),
我的Model类代码
import 'package:agent_banking/base/base_model.dart'; import 'package:json_annotation/json_annotation.dart'; part 'outlet_expansion_achievement_ab_rh_ho_bar_graph_list_model.g.dart'; @JsonSerializable() class OutletExpansionAchievementAbRhHoBarGraphListModel{ List<OutletExpansionAchievementAbRhHoBarGraphModel> outletExpansionAchievementAbRhHoBarGraphList; OutletExpansionAchievementAbRhHoBarGraphListModel( this.outletExpansionAchievementAbRhHoBarGraphList); factory OutletExpansionAchievementAbRhHoBarGraphListModel.fromJson(Map<String, dynamic> json) => _$OutletExpansionAchievementAbRhHoBarGraphListModelFromJson(json); Map<String, dynamic> toJson() => _$OutletExpansionAchievementAbRhHoBarGraphListModelToJson(this); @override String toString() { return 'OutletExpansionAchievementAbRhHoBarGraphListModel{outletExpansionAchievementAbRhHoBarGraphList: $outletExpansionAchievementAbRhHoBarGraphList}'; } } @JsonSerializable() class OutletExpansionAchievementAbRhHoBarGraphModel { OutletExpansionAchievementAbRhHoBarGraphModel({ this.count, this.month,}); @JsonKey(name: 'MONTH') int? month; @JsonKey(name: 'COUNT') int? count; factory OutletExpansionAchievementAbRhHoBarGraphModel.fromJson(Map<String, dynamic> json) => _$OutletExpansionAchievementAbRhHoBarGraphModelFromJson(json); Map<String, dynamic> toJson() => _$OutletExpansionAchievementAbRhHoBarGraphModelToJson(this); @override String toString() { return 'OutletExpansionAchievementAbRhHoBarGraphModel{month: $month, count: $count}'; } } class OutletExpansionAchievementAbRhHoBarGraphListModelCreator extends BaseModelCreator<OutletExpansionAchievementAbRhHoBarGraphListModel>{ @override OutletExpansionAchievementAbRhHoBarGraphListModel fromJson(Map<String, dynamic> json) { // TODO: implement fromJson throw UnimplementedError(); } @override OutletExpansionAchievementAbRhHoBarGraphListModel fromList(List jsonList) { List<OutletExpansionAchievementAbRhHoBarGraphModel> list = []; jsonList.forEach((element) { list.add(OutletExpansionAchievementAbRhHoBarGraphModel.fromJson(element)); }); return OutletExpansionAchievementAbRhHoBarGraphListModel(list); } }
验证结果与优化建议
核心求和逻辑正确性
你使用fold从0.0开始累加,将每个item.count转为Double后求和的思路是正确的,能满足Double类型求和需求,针对示例列表可算出正确总和(41.0)。空安全风险优化
当前代码用sum!和item.count!强制解包,若列表中存在count为null的对象,会直接抛出空指针异常。建议修改为:sum = snapshot.data?.model?.outletExpansionAchievementAbRhHoBarGraphList.fold(0.0, (sum, item) => sum + (item.count?.toDouble() ?? 0.0));这样即使
item.count为null,也会用0.0替代,避免崩溃。全局变量与空判断优化
- 确保全局变量
sum的类型为double?或初始化为0.0,避免未初始化问题; - 简化空判断条件,无需判断
toString()相关内容,直接判断列表非空更高效:snapshot.hasData && snapshot.data?.model != null && snapshot.data!.model!.outletExpansionAchievementAbRhHoBarGraphList.isNotEmpty
- 确保全局变量
内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi
相关产品推荐
相关产品推荐

