Flutter中如何使用dio通过post方法在form-data中传递列表

Flutter Dio FormData 列表参数提交方案
Dio的FormData本身支持列表参数提交,只需根据后端接收规则调整参数格式即可,以下是两种通用实现方式:
场景1:后端默认接收 key[]=value1&key[]=value2 格式数组
大部分PHP、Node、Python后端框架默认适配该格式,直接给键名加[]后缀即可:
import 'package:dio/dio.dart'; void postForm() async { final dio = Dio(); // 示例列表参数 List<String> hobbyList = ["阅读", "运动", "编程"]; final formData = FormData.fromMap({ // 列表参数键名加[]后缀 "hobby[]": hobbyList, // 其他普通参数 "username": "test", "age": 24 }); try { final res = await dio.post( "你的接口地址", data: formData, ); print(res.data); } catch (e) { print("请求错误:$e"); } }
场景2:后端要求接收 key[0]=value1&key[1]=value2 带索引格式数组
部分Java SpringBoot、Go后端会要求该格式,需手动遍历列表拼接带索引的键名:
import 'package:dio/dio.dart'; void postForm() async { final dio = Dio(); List<String> hobbyList = ["阅读", "运动", "编程"]; final formData = FormData(); // 遍历列表逐个添加字段 for (int i = 0; i < hobbyList.length; i++) { formData.fields.add(MapEntry("hobby[$i]", hobbyList[i])); } // 添加普通参数 formData.fields.add(const MapEntry("username", "test")); formData.fields.add(const MapEntry("age", "24")); try { final res = await dio.post( "你的接口地址", data: formData, ); print(res.data); } catch (e) { print("请求错误:$e"); } }
注意事项
- 若提交的是嵌套对象组成的列表,需按照后端规则拼接键名,例如
userList[0].name=xxx,或先将单个对象序列化为JSON字符串后提交 - 提交前可打印
formData.fields确认字段格式与后端要求一致 - Dio会自动为FormData请求设置正确的
multipart/form-data请求头,无需手动配置
内容的提问来源于stack exchange,提问作者Arijit Sarkar
相关产品推荐
相关产品推荐

