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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 04:35:46