Flutter项目中POST请求多参数设置及revision_type字符串与整数同步问题问询
解决Flutter中Dropdown字符串转后端所需整数的问题
嘿,这个问题其实很常见——前端要给用户展示友好的字符串选项,但后端需要对应的编码值,我们只需要加一层映射转换就能搞定!
步骤1:创建字符串到整数的映射表
首先定义一个Map来存储你提到的对应关系,这样就能快速把用户选择的字符串转成后端需要的整数:
// 可以把这个映射表放在你的页面类里作为成员变量,方便调用 final Map<String, int> revisionTypeMapping = { 'videnge': 0, 'visite technique': 1, 'assurance véhicule': 2, 'autre': 3, };
步骤2:修改API请求的请求体
你原来的body是Map<String, String>类型,但现在要传入整数,所以需要改成Map<String, dynamic>,然后通过映射表把字符串转成整数:
// 修改setRevision函数里的body部分 Map<String, dynamic> body = { 'revision_type': revisionTypeMapping[revision_type], // 这里完成字符串到整数的转换 'revision_title': revision_title, 'revision_date': revision_date, 'revision_location': revision_location, 'kilometrage_pour_vidange': kilometrage_pour_vidange, };
步骤3:确保Dropdown选中值正确传递
你的Dropdown部分已经能正确获取用户选择的字符串(存在status变量里),调用setRevision时直接传这个字符串就行,转换工作交给上面的映射表处理,不用修改Dropdown的现有逻辑。
完整修改后的setRevision函数示例
Future<String> setRevision(String revision_type, String revision_title, String revision_date, String revision_location, String kilometrage_pour_vidange) async { SharedPreferences localStorage = await SharedPreferences.getInstance(); String token = localStorage.getString('access_token'); await checkInternet(); // 定义映射表 final Map<String, int> revisionTypeMapping = { 'videnge': 0, 'visite technique': 1, 'assurance véhicule': 2, 'autre': 3, }; Map<String, String> headers = { 'Content-type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Bearer $token' }; // 注意这里改成Map<String, dynamic>以支持整数类型 Map<String, dynamic> body = { 'revision_type': revisionTypeMapping[revision_type], 'revision_title': revision_title, 'revision_date': revision_date, 'revision_location': revision_location, 'kilometrage_pour_vidange': kilometrage_pour_vidange, }; try { final response = await http.post(Uri.parse(ApiUtil.SET_REVISION), headers: headers, body: jsonEncode(body)); final responseBody = jsonDecode(response.body); print(responseBody); var data = responseBody['message']; // 这里修正为从响应体取message,不是请求体 switch (response.statusCode) { case 200: return data; default: throw Exception('请求失败,状态码:${response.statusCode}'); } } catch(e) { rethrow; } }
额外小提醒
你原来的API函数setRevision里混入了Dropdown的UI代码(Row那部分),这是不合理的——API请求函数应该只负责网络逻辑,UI代码要放在Widget的build方法里,记得把这部分代码移到正确的位置哦!
内容的提问来源于stack exchange,提问作者lucky
相关产品推荐
相关产品推荐

