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

如何对列表中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);
 }

}

验证结果与优化建议

  1. 核心求和逻辑正确性
    你使用fold从0.0开始累加,将每个item.count转为Double后求和的思路是正确的,能满足Double类型求和需求,针对示例列表可算出正确总和(41.0)。

  2. 空安全风险优化
    当前代码用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替代,避免崩溃。

  3. 全局变量与空判断优化

    • 确保全局变量sum的类型为double?或初始化为0.0,避免未初始化问题;
    • 简化空判断条件,无需判断toString()相关内容,直接判断列表非空更高效:
      snapshot.hasData && 
      snapshot.data?.model != null && 
      snapshot.data!.model!.outletExpansionAchievementAbRhHoBarGraphList.isNotEmpty
      

内容的提问来源于stack exchange,提问作者Md. Fazle Rabbi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:45:37