Flutter中累加星级字段求平均值并在Text组件展示的实现问题
场景
我使用flutter_bloc库模式获取JSON数据,需实现的需求为:累加所有star键对应的数值,再除以star字段的总数量得到星级平均值。以下是使用的JSON数据和目前已编写的Dart代码:
JSON Data
"feedbacks": [ { "id": 1, "comment": "Corporate Brand Supervisor", "star": 1, "createdAt": "2021-09-07T11:35:15.954Z", "updatedAt": "2021-09-07T11:35:15.954Z", "customerId": 10, "branchId": 3 }, { "id": 9, "comment": "Principal Implementation Liaison", "star": 1, "createdAt": "2021-09-07T11:35:15.954Z", "updatedAt": "2021-09-07T11:35:15.954Z", "customerId": 1, "branchId": 3 } ],
HomePage.dart 现有代码
Row( children: [ for (var i in data[index].feedbacks!) Text(i!.star!.toString()),],), //此处期望输出星级平均值,按示例数据计算为1+1/2 = 1.5
实现方案
对feedback列表做聚合计算即可,以下是两种常用实现方式:
方式1:基础循环实现(可读性更高)
Row( children: [ (){ // 空列表判断,避免除以0报错 if(data[index].feedbacks?.isEmpty ?? true) { return const Text('暂无评分'); } double totalStar = 0; for (var feedback in data[index].feedbacks!) { // 兼容star为空的异常场景 totalStar += feedback?.star ?? 0; } double avgStar = totalStar / data[index].feedbacks!.length; // 保留1位小数输出 return Text(avgStar.toStringAsFixed(1)); }() ], )
方式2:fold简化实现(代码更简洁)
Row( children: [ if(data[index].feedbacks?.isEmpty ?? true) const Text('暂无评分') else Text( data[index].feedbacks! .fold<double>(0, (previousValue, element) => previousValue + (element?.star ?? 0)) / data[index].feedbacks!.length .toStringAsFixed(1) ) ], )
以上两种方式代入你的示例数据后都会输出1.5,同时兼容空列表、star字段为空的异常场景,避免运行时报错。
内容的提问来源于stack exchange,提问作者Mohammed Nabil
相关产品推荐
相关产品推荐

