Dart POST请求参数类型不匹配求助:String无法赋值给Map<String,dynamic>?
解决Dart POST请求中的类型错误:'String'无法赋值给'Map<String, dynamic>?'
错误原因
你遇到的类型错误源于自定义的postRequest函数对body参数的类型限定为Map<String, dynamic>?,但你传入的是json.encode(myMap)生成的字符串,两种类型不兼容。
两种解决方案
方案1:直接传递原始Map(推荐,若postRequest内部支持自动编码)
如果你的postRequest函数内部会自动将Map转换为JSON字符串,无需手动编码,直接传入原始myMap即可:
Map<String, dynamic>? myMap = { 'conversationId': iD, 'type': 'text', 'data': _controller.text.toString(), 'msgLength': _controller.text.length, 'senderId': Provider.of(context, listen: false).id, 'createdOn': 190823, 'messageState': 'delivered', 'isDeleted': 0, 'id': 3048, }; // 直接传入myMap,无需手动json.encode final response = await postRequest( url: conversationUrl, body: myMap, headers: {'Content-Type': 'application/json'}, );
方案2:修改postRequest函数的参数类型
如果需要保留手动JSON编码的逻辑,修改postRequest的body参数类型为dynamic(或直接String?),使其同时支持Map和String类型:
// 修改后的postRequest函数定义 Future<Response> postRequest({ required String url, dynamic body, // 将类型从Map<String, dynamic>?改为dynamic Map<String, String>? headers, }) async { // 可选:自动处理Map到JSON的转换 if (body is Map) { body = json.encode(body); } return await http.post(Uri.parse(url), body: body, headers: headers); }
修改后,你原本传入encoded字符串的代码就能正常运行。
关于参考Stack Overflow方案无效的说明
你参考的方案针对的是Dart官方http包的原生post方法(其body参数为dynamic类型,支持Map或String),但你使用的是自定义封装的postRequest函数,它的参数类型限制导致方案不适用,需要针对自定义函数做调整。
内容的提问来源于stack exchange,提问作者Ma'arij AQ
相关产品推荐
相关产品推荐

