Flutter中如何对接口返回的Map数据按chapter字段排序与分组
问题修复说明
你的代码存在两处核心问题:
- 分组Map的类型定义错误:顶层键是字符串类型的章节名,对应的值应该是该章节下所有条目的列表,而非单个条目。
- 逻辑缺失:已存在对应章节键时,没有将新条目追加到对应列表中。
实现方案
方案1:手动遍历实现(无额外依赖)
直接修改你原有的遍历逻辑即可:
// 定义正确类型的分组Map:键为章节名,值为对应章节的条目列表 Map<String, List<Map<String, dynamic>>> sortedTable = {}; Iterable<Map<String, dynamic>> data = subjectModules.map((e) => e.toMap()); for (var map in data) { try { String chapter = map['chapter'] as String; // 若章节不存在则先初始化空列表 sortedTable.putIfAbsent(chapter, () => []); // 将当前条目追加到对应章节的列表中 sortedTable[chapter]?.add(map); } catch(e) { print('分组错误:$e'); } }
如果你不需要提前转成Map,想直接保留原始Item类型,可以改成如下写法,性能更好:
Map<String, List<Item>> sortedTable = {}; for (var item in subjectModules) { try { String chapter = item.chapter; // 直接取Item的chapter属性即可 sortedTable.putIfAbsent(chapter, () => []); sortedTable[chapter]?.add(item); } catch(e) { print('分组错误:$e'); } }
方案2:使用官方collection工具包简化实现
如果项目允许引入第三方依赖,可以添加collection包后直接调用groupBy方法,一行代码完成分组:
import 'package:collection/collection.dart'; // 直接按chapter字段分组 final sortedTable = groupBy(subjectModules, (Item item) => item.chapter);
分组后的数据结构完全符合你的需求:章节名作为一级键,对应值为该章节所有Item的列表。
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

