Flutter拉取JSON数据时出现类型不匹配及主机查询失败异常如何解决
第一类异常(类型不匹配)解决方法
异常原因
你最初代码直接对json.decode(response.body)返回的Map类型整体调用forEach方法,Map的forEach要求传入的回调函数必须接收2个参数(key、value),但你传入的回调仅接收1个element参数,类型不匹配触发报错。
你调整为遍历data['products']的代码已经修复了这个问题,data['products']是数组类型,数组的forEach仅需要1个参数的回调,逻辑正确。
配套需修正的解析逻辑问题
即便修复遍历逻辑,后续解析JSON还会遇到其他报错,需同步修改:
- 字段类型不匹配:
Product类中price、discount、finalprice定义为int?,但接口返回的是浮点型数值,需修改为double?或num?类型 - 字段拼写不匹配:接口返回的收藏字段为
favourites(带u),你代码中写的是favorites,拼写不一致会导致取值为null;同时接口返回的favourites是数组类型,你定义为bool?,可修改为favorites = (json['favourites'] as List?)?.isNotEmpty ?? false;实现布尔类型赋值 - 分类解析逻辑错误:接口返回的商品分类结构为嵌套结构
{"name": "Shirts", "category": {"id": 1, "name": "Clothing"}},你当前Category.fromJson直接取json['id']会得到null,需调整为:
Category.fromJson(Map<String, dynamic> json) { id = json['category']['id']; categoryName = json['category']['name']; }
第二类异常(域名解析失败)解决方法
报错SocketException: Failed host lookup: 'ecom.techoxy.in'是网络层面的问题,按以下步骤排查:
- 确认测试设备/模拟器已连接正常可用的公网
- 先在电脑浏览器访问完整接口地址
https://ecom.techoxy.in/home,确认接口本身可以正常访问、域名可正常解析 - 如果你是本地部署的后端服务,不要用域名,直接填写你电脑的局域网IP地址,注意模拟器不要使用
127.0.0.1(该地址指向模拟器本身),要填电脑实际的局域网IP - 检查Android项目网络权限:在
android/app/src/main/AndroidManifest.xml中添加网络权限声明:
<uses-permission android:name="android.permission.INTERNET" />
内容的提问来源于stack exchange,提问作者Rohit Bongade
相关产品推荐
相关产品推荐

