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

Flutter如何添加API学期参数筛选数据并解决展示重复问题?

解决学期筛选API参数添加与卡片重复显示问题

1. 给API添加学期筛选参数

首先修改API调用函数,新增学期参数并传入请求URL的查询参数中,同时完善错误处理逻辑:

static Future<List<DataKuliahModel>> getDataKuliah(String semester) async {
  String url = Constant.baseURL;
  String token = await UtilSharedPreferences.getToken();

  final response = await http.get(
    // 将学期参数拼接为API查询参数,符合后端筛选要求
    Uri.parse('$url/auth/mhs_siakad/perwalian/get_paket?semester=$semester'),
    headers: {'Authorization': 'Bearer $token'},
  );

  // 处理请求失败场景
  if (response.statusCode != 200) {
    throw Exception('加载课程失败,状态码: ${response.statusCode}');
  }

  // 解析后端返回的对应学期课程列表(假设返回data为数组格式)
  final List<dynamic> result = jsonDecode(response.body)['data'];
  return result.map((item) => DataKuliahModel.fromMap(item)).toList();
}

注:如果后端返回的data仍为Map结构(仅包含当前学期的课程键值对),可保留原返回类型Map<String, DataKuliahModel>,后续展示逻辑需对应调整。

2. 修复卡片重复显示问题

之前所有卡片显示相同数据的核心原因是:仅从API返回的Map中取了单条数据,所有卡片复用该数据。现在API返回对应学期的完整课程列表,需遍历列表生成独立卡片,同时优化FutureBuilder的使用避免重复请求:

步骤1:在State类中管理请求Future

避免每次build都重新发起请求,将Future存为State变量:

class YourCoursePageState extends State<YourCoursePage> {
  late Future<List<DataKuliahModel>> _coursesFuture;
  String _selectedSemester = '2'; // 默认选中第2学期

  @override
  void initState() {
    super.initState();
    // 初始化加载默认学期数据
    _coursesFuture = Services.getDataKuliah(_selectedSemester);
  }

  // 用户切换学期时调用此方法
  void _switchSemester(String newSemester) {
    setState(() {
      _selectedSemester = newSemester;
      // 更新Future,触发重新请求
      _coursesFuture = Services.getDataKuliah(newSemester);
    });
  }

  // ... build方法
}

步骤2:修改FutureBuilder展示逻辑

遍历课程列表生成独立卡片:

FutureBuilder<List<DataKuliahModel>>(
  future: _coursesFuture, // 使用State中管理的Future
  builder: (context, snapshot) {
    // 加载中状态
    if (snapshot.connectionState == ConnectionState.waiting) {
      return const Center(child: CircularProgressIndicator());
    }
    // 错误状态
    if (snapshot.hasError) {
      return Center(child: Text('出错了: ${snapshot.error}'));
    }
    // 空数据状态
    if (!snapshot.hasData || snapshot.data!.isEmpty) {
      return const Center(child: Text('该学期暂无课程'));
    }

    // 遍历课程列表,为每个课程生成独立卡片
    return Column(
      children: snapshot.data!.map((course) {
        return Container(
          width: MediaQuery.of(context).size.width,
          margin: const EdgeInsets.symmetric(vertical: 8, horizontal: 16),
          decoration: BoxDecoration(
            color: Colors.white,
            borderRadius: BorderRadius.circular(8),
            boxShadow: [
              BoxShadow(
                color: Colors.grey.withOpacity(0.2),
                spreadRadius: 1,
                blurRadius: 9,
                offset: const Offset(1, 2),
              ),
            ],
          ),
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Text(
                  course.matakuliah,
                  style: bold6,
                  textAlign: TextAlign.center,
                ),
                // 可添加更多课程信息,如学分、授课教师等
              ],
            ),
          ),
        );
      }).toList(),
    );
  },
)

关键说明

  • 重复显示原因:之前仅从API返回的Map中取单条数据,所有卡片复用该数据导致重复。现在通过遍历对应学期的课程列表,每个卡片绑定独立的课程数据解决问题。
  • Future优化:将Future存为State变量,仅在学期切换时重新创建Future,避免build方法执行时重复发起API请求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:55:16