You need to enable JavaScript to run this app. Flutter/Dart基于嵌套学校学生JSON实现多条件列表生成与页面跳转
优惠活动
大模型
产品
解决方案
定价
更多

Flutter/Dart基于嵌套学校学生JSON实现多条件列表生成与页面跳转

Flutter 单文件实现多层嵌套学生数据处理全流程

实现前提

  • 所有逻辑、页面、实体类全部在单个.dart文件内完成,不拆分多模块、不引入额外状态管理依赖,完全闭环
  • 适配多层嵌套的学校-班级-学生JSON结构,不需要改造原始数据格式

分步实现逻辑

1. 全量JSON解析与可操作列表构建

  • 直接在文件内定义原始嵌套JSON字符串,模拟从接口拉取的多层数组结构:最外层是学校数组,每个学校嵌套班级数组,每个班级再嵌套学生数组
  • 内联定义轻量实体类,每个类内置fromJson解析方法,不需要依赖序列化插件
  • 解析阶段做结构拍平:遍历所有学校、班级、学生层级,把原本需要多层穿透获取的学校名称、班级信息、班级规模直接挂载到每个学生实体上,生成全局可操作的List<StudentModel> allStudents列表,后续所有展示、筛选都基于这个拍平列表操作,避免重复循环查找的性能损耗

2. 指定学校学生列表ListView渲染

  • 根据指定的目标学校标识,从allStudents中筛选出匹配的学生集合
  • 用ListView构建列表项,每个item仅展示要求的三类信息:学生ID、出生日期、年龄
  • 给每个列表项绑定点击回调,持有当前选中的学生实体对象

3. 学生详情页跳转

  • 在当前文件内直接定义详情页的Widget类,不需要单独新建文件,跳转时直接将选中的学生对象作为构造参数传入
  • 详情页无额外数据请求,直接从传入的学生实体中读取并展示:所属学校名称、所在班级、班级规模、年龄、出生日期
  • 用MaterialPageRoute完成页面跳转,因为所有类都在同文件内,不需要跨文件导入依赖

4. 分学费状态的双独立ListView实现

  • 基于拍平后的全量学生列表做两次集合筛选:
    • 学费已缴列表:筛选缴纳状态值为1的学生,每个列表项展示学生关联的所属学校名称,用独立ListView渲染
    • 学费未缴列表:筛选缴纳状态值为0的学生,每个列表项展示学生关联的所属学校名称,用独立ListView渲染
  • 两个ListView可以通过Column上下排布,不需要复杂的Tab联动逻辑

核心可复用代码片段

  • 嵌套结构拍平逻辑(仅在页面初始化时执行一次,避免build阶段重复计算):
List<StudentModel> allStudents = [];
final rawSchoolData = jsonDecode(rawNestedJsonStr) as List;
for (var school in rawSchoolData) {
  final schoolName = school['schoolName'] as String;
  final schoolId = school['schoolId'] as int;
  for (var classItem in school['classList']) {
    final className = classItem['className'] as String;
    final classSize = (classItem['studentList'] as List).length;
    for (var stu in classItem['studentList']) {
      allStudents.add(StudentModel(
        id: stu['studentId'],
        birthDate: stu['birthDate'],
        age: stu['age'],
        tuitionStatus: stu['tuitionStatus'],
        schoolId: schoolId,
        schoolName: schoolName,
        className: className,
        classSize: classSize,
      ));
    }
  }
}
  • 指定学校筛选逻辑:
const int targetSchoolId = 1; // 替换为实际需要展示的指定学校ID
final targetSchoolStudentList = allStudents.where((stu) => stu.schoolId == targetSchoolId).toList();
  • 学费状态分栏筛选逻辑:
final paidTuitionList = allStudents.where((stu) => stu.tuitionStatus == 1).toList();
final unpaidTuitionList = allStudents.where((stu) => stu.tuitionStatus == 0).toList();

落地注意事项

  • 拍平全量数据、做列表筛选的操作仅在页面initState阶段执行一次,不要在build方法内重复计算,避免列表滚动时的性能卡顿
  • 同文件内定义的详情页Widget可以直接构造实例传参,不需要在路由表中注册
  • 实体类的定义要放在文件的顶层,避免出现类型未定义的编译错误

内容的提问来源于stack exchange,提问作者SHAFI TPM

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 07:15:08