【问题标题】:Flutter 'Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'List<class>'Flutter'未处理的异常:类型'List<dynamic>'不是'List<class>'类型的子类型
【发布时间】:2023-04-03 06:20:02
【问题描述】:

我正在从 API 获取数据,并尝试将这些数据推送到两个变量中。我可以访问返回的部分数据,但不能访问全部,我可以打印所有数据,但是当我尝试访问其中的特定部分时,它不起作用。

例如: 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
        },
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    错误是因为您没有将 json['feeds'] 作为列表传递。您的 FeedData 类必须更改为以下内容,这是假设您的 FeedItem 类也有 fromJson 方法:

    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: List.from(json['feeds']).map((item)=>FeedItem.fromJson(item)).toList(),
        );
      }
    }
    

    请根据您的数据查看工作代码。也可以在DartPadhttps://dartpad.dev/24694a911ddd0619277f5780573086f1上加载如下代码

    void main() {
    
      Map<String, dynamic> json = {
        "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
            },
          ]
    };
      
      
      FeedData feedData = FeedData.fromJson(json);
      print(feedData.feeds.length);
    }
    
    
    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: List.from(json['feeds']).map((item)=>FeedItem.fromJson(item)).toList(),
        );
      }
    }
    
    
    class FeedItem {
      int id;
      String photoUrl;
      String description;
      String dateAdded;
      bool isMain;
      Null publicId;
      bool isImage;
      String mainImage;
      int userId;
      Null likers;
      String username;
      Null thumbnail;
      int likes;
    
      FeedItem(
          {this.id,
          this.photoUrl,
          this.description,
          this.dateAdded,
          this.isMain,
          this.publicId,
          this.isImage,
          this.mainImage,
          this.userId,
          this.likers,
          this.username,
          this.thumbnail,
          this.likes});
    
      FeedItem.fromJson(Map<String, dynamic> json) {
        id = json['id'];
        photoUrl = json['photoUrl'];
        description = json['description'];
        dateAdded = json['dateAdded'];
        isMain = json['isMain'];
        publicId = json['publicId'];
        isImage = json['isImage'];
        mainImage = json['mainImage'];
        userId = json['userId'];
        likers = json['likers'];
        username = json['username'];
        thumbnail = json['thumbnail'];
        likes = json['likes'];
      }
    }
    

    【讨论】:

      【解决方案2】:

      当你在做feeds: json['feeds']时,你基本上是在尝试将Map&lt;String,dynamic&gt;分配给一个类FeedItem,而且你想将一个完整的列表分配给List&lt;Map&lt;String,dynamic&gt;&gt;List&lt;FeedItem,问题是颤动就是不能自动解析数据并像这样赋值,需要逐级深入,将Map&lt;String,dynamic&gt;赋值给FeedItem,最后转化为List

      我将根据我的知识分享一段代码,我是如何解决这类问题的,我相信这会让你更好地了解你的问题(如果没有解决它)

      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;
      }
      

      }

      【讨论】:

        【解决方案3】:

        您没有将 feedItems 转换为对象

          factory FeedData.fromJson(Map<String, dynamic> json) {
            return FeedData(
              data: json['data'],
              feeds: json['feeds'],  # <- here is the problem
            );
        

        应该是这样的:

        feeds: (json['feeds'] as List)
                ?.map((e) =>
                    e == null ? null : FeedItem.fromJson(e as Map<String, dynamic>))
                ?.toList(),
        

        【讨论】:

          【解决方案4】:

          请更改此代码

          print(res.feeds);    -->  print(res.feeds[0]);
          print(res.feeds.id); --> print(res.feeds[0].id);
          

          【讨论】:

            猜你喜欢
            • 2021-08-15
            • 1970-01-01
            • 2021-08-03
            • 1970-01-01
            • 2021-09-16
            • 2021-04-04
            • 1970-01-01
            • 2022-09-26
            • 2023-02-26
            相关资源
            最近更新 更多