flutter - 颤振'未处理的异常:类型'列表' 不是类型 'List 的子类型'
问题描述
我正在从 API 获取数据,并试图将这些数据推送到两个变量中。我可以访问返回的部分数据,但不是全部,我可以打印所有数据,但是当我尝试访问其中的特定部分时,它不起作用。
EG: res = 来自 API 的响应
print(res.data); // This works
print(res.feeds); // This doesn't work
print(res.feeds.id); // This doesn't work
我得到的错误是:
'Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<FeedItem>'
这就是我转换和读取数据的方式:
class FeedData {
String data;
List<FeedItem> feeds;
FeedData({this.data, this.feeds});
factory FeedData.fromJson(Map<String, dynamic> json) {
return FeedData(
data: json['data'],
feeds: json['feeds'],
);
}
}
我可以读取和访问“数据”但不能访问“提要”,这是我的问题,我需要能够访问“提要”中的数据“FeedItem”类的构建方式与“FeedData”相同类,所以我确定它是正确构建的
这就是我调用数据的方式:
getUserFeed() async {
FeedData res = FeedData.fromJson(
await requests.get(url: 'feeds/u?u=jxchumber&PageNumber=1'));
print(res.data);
// res.data works
print(res.feeds);
// res.feeds doesn't work
}
这是从 API 返回的数据:
{
"data": "default",
"feeds": [
{
"id": 2,
"photoUrl": "https://cartalkio-image-storage-dev.s3.eu-west-2.amazonaws.com/o85DvOaTXXE.jpg",
"description": "Magna duis consectetur sit ut commodo non eiusmod.",
"dateAdded": "0001-01-01T00:00:00",
"isMain": false,
"publicId": null,
"isImage": true,
"mainImage": "https://randomuser.me/api/portraits/men/76.jpg",
"userId": 9,
"likers": null,
"username": "Larsen",
"thumbnail": null,
"likes": 0
},
{
"id": 4,
"photoUrl": "https://cartalkio-image-storage-dev.s3.eu-west-2.amazonaws.com/lXR833PRh3g.jpg",
"description": "Magna duis consectetur sit ut commodo non eiusmod.",
"dateAdded": "0001-01-01T00:00:00",
"isMain": false,
"publicId": null,
"isImage": true,
"mainImage": "https://randomuser.me/api/portraits/men/4.jpg",
"userId": 8,
"likers": null,
"username": "Lloyd",
"thumbnail": null,
"likes": 0
},
}
解决方案
当你在做的时候feeds: json['feeds']
,你基本上是想给Map<String,dynamic>
一个类分配一个FeedItem
,而且你想分配一个完整的列表List<Map<String,dynamic>>
,List<FeedItem
问题是flutter不能自动解析数据并像这样分配,你需要深入逐级分配Map<String,dynamic>
,FeedItem
然后最终将其转换为列表
我将根据我的知识分享一段代码,我如何解决这类问题,我相信这会让你更好地了解你的问题(如果没有解决它)
Future<void> getData() async {
http.Response response =
await http.get('Example address');
if (response.statusCode == HttpStatus.ok) {
//if the status code is 200 or 'OK' parse the data and convert Outer layer as List
//after that , Map each element as a FeedItem and finally convert the result to List
feeds = (json.decode(response.body) as List)
.map<FeedItem>(
(_feed) => FeedItem.fromJSON(_feed))
.toList();
} else {
throw response;
}
}
推荐阅读
- ios - 有没有办法从界面生成器自动设置 UITextfield 委托?
- python - 当一列与其他列分开时如何选择 DataFrame 列?
- asp.net-core - 如何在 EntityFramework Core 的现有数据库上下文中添加 Sql Server 视图
- jdiframework - JSF Primefaces selectone 组件的 jdi 轻框架
- c# - SecureString 是否在 Windows 上运行的 .NET 5 和 .NET Core 中加密?
- c# - 当该对象中存在动态类型 JSON 数组时,反序列化 JSON 字符串
- python - Pyrogram 在 Pytelegrambotapi 处理程序中不起作用
- go - 使用 chromedp 时找不到具有给定 id (-32000) 的节点
- vue.js - Nuxt.js 动态嵌套视图和参数
- python-2.7 - 将现有的 config.add_route,金字塔 1.4 升级到 1.10