首页 > 解决方案 > 颤振'未处理的异常:类型'列表' 不是类型 '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
        },
}

标签: flutterdart

解决方案


当你在做的时候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;
}

}


推荐阅读