如何在Flutter中用ExpansionTile展示groupBy分组后的列表数据?
解决方案
首先修正你代码里的字段类型错误:alumnNumber定义为String但实例化时传入的是整数,会导致编译错误,先改为int类型:
class School { final String classname; final String section; final int alumnNumber; // 修正为int类型 School({required this.classname, required this.section, required this.alumnNumber}); }
确保你已在pubspec.yaml中添加collection依赖(groupBy方法来自这个包):
dependencies: flutter: sdk: flutter collection: ^1.18.0 # 使用最新版本即可
接下来直接通过遍历分组后的映射数据,为每个分组生成ExpansionTile组件,完整实现代码如下:
class GroupedSchoolList extends StatelessWidget { final List<School> schoolList = [ School(classname: "test1", section: "A", alumnNumber: 20), School(classname: "test2", section: "B", alumnNumber: 10), School(classname: "test3", section: "C", alumnNumber: 15), School(classname: "test4", section: "B", alumnNumber: 16), School(classname: "test5", section: "A", alumnNumber: 22), School(classname: "test6", section: "D", alumnNumber: 25), School(classname: "test7", section: "A", alumnNumber: 24), School(classname: "test8", section: "A", alumnNumber: 21), ]; GroupedSchoolList({super.key}); @override Widget build(BuildContext context) { final sectionGroup = groupBy(schoolList, (School obj) => obj.section); return Scaffold( appBar: AppBar(title: const Text("班级分组列表")), body: ListView( children: sectionGroup.entries.map((entry) { final section = entry.key; final schoolsInSection = entry.value; return ExpansionTile( title: Text("Section $section"), subtitle: Text("共${schoolsInSection.length}个班级"), children: schoolsInSection.map((school) { return ListTile( title: Text(school.classname), trailing: Text("人数: ${school.alumnNumber}"), ); }).toList(), ); }).toList(), ), ); } }
关键逻辑说明
- 通过
sectionGroup.entries获取分组后的所有键值对,每个entry包含分组标识(section名称)和对应班级列表 - 每个分组对应一个
ExpansionTile,标题展示section名称,副标题显示该分组下的班级数量 - 展开面板的子项通过遍历对应分组的班级列表,生成
ListTile展示每个班级的名称和人数
内容的提问来源于stack exchange,提问作者Marcello Christophar Vecchio
相关产品推荐
相关产品推荐

