Flutter中Dio拦截器给请求data对象添加channelId失败问题
Dio拦截器添加channelId到请求body的问题解决
你的问题出在options.data可能不是普通的Map类型,直接用Map的方式赋值会导致静默错误,从而卡住代码执行。比如当请求使用FormData提交表单时,options.data是FormData实例,无法通过[]直接赋值;或者data是JSON字符串等其他类型,也会导致操作失败。
修改后的拦截器代码
..interceptors.add( InterceptorsWrapper( onRequest: (options, handler) async { final channelId = storage.readRole()?.id; if (channelId == null) { return handler.next(options); } if (options.data == null) { options.data = {"channelId": channelId}; } else { // 根据data的实际类型处理 if (options.data is Map<String, dynamic>) { (options.data as Map<String, dynamic>)["channelId"] = channelId; } else if (options.data is FormData) { // 处理表单提交的情况 (options.data as FormData).fields.add(MapEntry("channelId", channelId.toString())); } else { // 尝试将其他类型数据转为Map处理 try { final dataMap = jsonDecode(options.data.toString()) as Map<String, dynamic>; dataMap["channelId"] = channelId; options.data = dataMap; } catch (e) { print("无法解析请求数据添加channelId: $e"); } } } return handler.next(options); }, ), )
关键说明
- 提前提取channelId:避免重复判断
role?.id,简化逻辑 - 类型判断处理:
- 普通Map类型:强转后直接添加键值对
- FormData类型:通过
fields.add方法添加字段(注意需要将channelId转为字符串,FormData字段值要求是字符串) - 其他类型:尝试转为JSON Map处理,转换失败则打印错误并保留原数据
- 空值快速返回:如果没有channelId,直接放行请求,无需后续处理
内容的提问来源于stack exchange,提问作者Aaron Balthaser
相关产品推荐
相关产品推荐

