Flutter Map中如何为同一键名添加多个不同值?
Dart/Flutter 中实现多重复键的参数构造
Dart 里的标准Map是键唯一的集合,直接通过addAll添加重复键会覆盖已有值,没法生成你想要的多相同键对应不同值的结构。以下是针对不同场景的解决方案:
场景1:给后端发送表单/API请求(最常见需求)
如果你的目标是生成类似item_name[]=Arpit&item_name[]=Ranjeet这种格式的请求参数(常用于application/x-www-form-urlencoded或multipart/form-data),可以这样处理:
方式1:构造查询字符串直接发送
// 假设三个数据源列表长度一致 List<String> shopping_item_name = ['Arpit', 'Ranjeet', 'Prabhat', 'Rohan']; List<String> shopping_quantity = ['2', '3', '10', '3']; List<String> shopping_unitPrice = ['1', '1', '1', '1']; // 生成所有键值对条目 List<MapEntry<String, String>> paramEntries = []; for (int i = 0; i < shopping_item_name.length; i++) { paramEntries.add(MapEntry('item_name[]', shopping_item_name[i])); paramEntries.add(MapEntry('item_description[]', shopping_quantity[i])); paramEntries.add(MapEntry('item_price[]', shopping_unitPrice[i])); } // 构造符合x-www-form-urlencoded格式的请求体 String requestBody = paramEntries .map((entry) => '${Uri.encodeComponent(entry.key)}=${Uri.encodeComponent(entry.value)}') .join('&'); // 发送请求(以http包为例) var response = await http.post( Uri.parse('你的接口地址'), body: requestBody, headers: {'Content-Type': 'application/x-www-form-urlencoded'}, );
方式2:用JSON数组传递(更规范的后端交互方式)
如果后端支持JSON格式,推荐构造数组结构而非重复键,可读性和扩展性更好:
List<Map<String, dynamic>> items = []; for (int i = 0; i < shopping_item_name.length; i++) { items.add({ 'item_name': shopping_item_name[i], 'item_description': shopping_quantity[i], 'item_price': shopping_unitPrice[i], }); } // 发送JSON请求 var response = await http.post( Uri.parse('你的接口地址'), body: jsonEncode({'items': items}), headers: {'Content-Type': 'application/json'}, );
场景2:生成类似示例的字符串结构
如果只是要生成你给出的那种带重复键的字符串格式,可以通过List<MapEntry>实现:
List<MapEntry<String, String>> entries = []; for (int i = 0; i < shopping_item_name.length; i++) { entries.add(MapEntry('item_name[]', shopping_item_name[i])); entries.add(MapEntry('item_description[]', shopping_quantity[i])); entries.add(MapEntry('item_price[]', shopping_unitPrice[i])); } // 转换为目标字符串 String resultStr = entries.map((e) => "'${e.key}': '${e.value}'").join(', '); print('{$resultStr}'); // 输出结果和你给出的示例一致
内容的提问来源于stack exchange,提问作者Arpit Jai
相关产品推荐
相关产品推荐

