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

Flutter测验应用如何存储用户点击的选项值并提交至POST请求接口

解决步骤

1. 替换存储答案的状态变量

你之前使用的局部变量sent每次选中新选项都会被覆盖,无法存储所有题目的作答记录。首先在当前页面的State类中定义一个全局Map来存储答案,支持自动覆盖同一题的修改结果:

// 写在State类内部,不要放在build方法中
Map<int, int> userAnswers = {};

2. 修改选项选中的回调逻辑

调整CustomCheckBoxGroup的选中回调,把每次的作答结果存入上面定义的Map:

checkBoxButtonValues: (values) {
  // 取出当前题目的ID和选中的选项ID
  int questionId = values[0][0] as int;
  int optionId = values[0][1] as int;
  // 存入Map,同一题重复选择会自动更新答案
  userAnswers[questionId] = optionId;
  print("当前已存储的答案:$userAnswers");
},

3. 组装符合接口要求的请求参数

修改saveAnswer方法中的参数组装逻辑,把Map转换为接口要求的数组格式:

Future<Sent> saveAnswer() async {
  setState(() {
    _isloading = true;
  });

  // 组装接口要求的参数格式
  Map<String, dynamic> data = {
    "data": userAnswers.entries.map((entry) {
      return {
        "question_id": entry.key,
        "option_id": entry.value
      };
    }).toList()
  };

  // 后续请求逻辑保持不变即可
  var url = await Network().link("/exercise/1/saveAnswer");
  SharedPreferences localStorage = await SharedPreferences.getInstance();
  final token = jsonDecode(localStorage.getString('token'));
  http.Response response = await http.post(Uri.parse(url), body: json.encode(data), headers: {
    'Content-type': 'application/json',
    'Accept': 'application/json',
    'Authorization': 'Bearer $token'
  });
  if (response.statusCode == 200) {
    print(response.body);
    print("Save success");
  } else {
    print(response.body);
    print("Save failed");
  }
}

可选优化:提交前校验是否答完所有题

如果要求用户必须完成所有题目才能提交,可以在组装参数前增加校验逻辑:

// snapshot.data.result.length为题目总数,根据你的实际变量名调整即可
if(userAnswers.length != snapshot.data.result.length) {
  ScaffoldMessenger.of(context).showSnackBar(const SnackBar(content: Text("请完成所有题目后提交")));
  setState(() {
    _isloading = false;
  });
  return;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:48:05