未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型

Posted

技术标签:

【中文标题】未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型【英文标题】:Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>' in dart/ flutter 【发布时间】:2021-12-29 07:34:57 【问题描述】:

我可以解码来自服务器的响应,但我不知道这是什么错误:\

这是我在 showproduct 类中的请求代码:

if (response.statusCode == 200) 

      setState(() 
        var bodybytedecoded= jsonDecode(utf8.decode(response.bodyBytes));

  final product= ProductModel.fromJson(bodybytedecoded); // console shows error come from this line
        print(product);
        
      );
    
    else 
      print(response.reasonPhrase);
    

在我的模型类中,我有:

class ProductModel
   final  int id;
   final  String name;
   final String regular_price;
   final String description;
   final List<ImageModel> image;

  ProductModel( required this.id,required this.name,required this.regular_price,  required this.description,required this.image);

  factory ProductModel.fromJson(Map<String,dynamic> json)
    final name = json["name"];
    final id = json ["id"];
    final regular_price = json["regular_price"];
    final description = json["description"];
    final image = json["image"];
    return ProductModel(id: id, name: name, regular_price: regular_price, description: description, image: image);
  

  Map<String,dynamic> toJson() 
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data["id"] = this.id;
    data["name"] = this.name;
    data["regular_rice"] = this.regular_price;
    data["description"] = this.description;
    data["image"] = this.image;
    return data;
  


class ImageModel
   final String src;
  ImageModel(required this.src);
  factory ImageModel.fromJson(Map<String,dynamic> json )
    return ImageModel(src:  json["src"]);
  



我不知道这个错误是为了什么,我的模型类有什么问题吗?还是我的要求? 如果有人能告诉我一个真正的方法,我将不胜感激。

这是完整的错误:

E/flutter (31338): [ERROR:flutter/lib/ui/ui_dart_state.cc(209)] Unhandled Exception: type 'List<dynamic>' is not a subtype of type 'Map<String, dynamic>'
E/flutter (31338): #0      _ShowProductState.FetchItems.<anonymous closure> (package:mystore/ProductPages/showproduct.dart:219:46)
E/flutter (31338): #1      State.setState (package:flutter/src/widgets/framework.dart:1088:30)
E/flutter (31338): #2      _ShowProductState.FetchItems (package:mystore/ProductPages/showproduct.dart:215:7)
E/flutter (31338): <asynchronous suspension>
E/flutter (31338): 

这是来自服务器的 json 正文:

[
    
        "id": 56012,
        "name": "a name",
        "slug": "a slug",
        "description": "<p>آب آشامیدنی پیورلایف 1/5 لیتری نستله</p>\n",
        "regular_price": "45000",
        "sale_price": "45000",
        "tags": [],
        "images": [
            
                "id": 56043,
                "src": "pic link",
                "name": "A name",
            
        ],
    ,
]

【问题讨论】:

请发布完整的错误消息,包括堆栈跟踪。它应该指出代码中的问题所在。此外,如果您发布了一个您尝试解析的 JSON 示例,那就太好了,因为错误表明 JSON 和模型之间的类型不匹配。 你在bodybytedecoded变量中解码json后得到一个列表吗? @julemand101 当然,我编辑了。 @Diwyansh 是的,我愿意,而且图像是一个列表。 您的响应返回的是列表还是对象? 【参考方案1】:

将此行添加到您的 ProductModel

List<ProductModel> productFromJson(String str) => List<ProductModel>.from(jsonDecode(str).map((x) => ProductModel.fromJson(x)));

并将您的代码更改为这样

if (response.statusCode == 200) 

      setState(() 
        var bodybytedecoded= jsonDecode(utf8.decode(response.bodyBytes));

  final product= productFromJson(bodybytedecoded); // console shows error come from this line
        print(product);
        
      );
    
    else 
      print(response.reasonPhrase);
    

【讨论】:

【参考方案2】:

问题是您正在尝试将列表映射到地图将此行更改为

 final product= ProductModel.fromJson(bodybytedecoded);

var bodybytedecoded= jsonDecode(utf8.decode(response.bodyBytes));
final List<ProductModel> products = bodybytedecoded
          .map((model) => ProductModel.fromJson(model));

顺便说一句,toJson 中有一个错字

 data["regular_rice"] = this.regular_price;

【讨论】:

控制台显示此错误:Unhandled Exception: type 'MappedListIterable&lt;dynamic, dynamic&gt;' is not a subtype of type 'List&lt;ProductModel&gt;' @NavidShokoufeh 请使用 http 请求方法更新主帖。我相信 utf8.decode 不仅需要jsonDecode(response.body)【参考方案3】:

您可以通过解码数据并将值存储在列表中来简单地做到这一点。

 var decodedResponse= jsonDecode(resonse.body); 

List<ProductModel> items=[];
  decodedResponse.forEach((e)
    items.add(ProductModel.fromJson(e));
  );

【讨论】:

点击链接gist.github.com/Jahidul007/98e5ea1107fb9dca0bb7809f558776d4

以上是关于未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型的主要内容,如果未能解决你的问题,请参考以下文章

未处理的异常:类型 'List<dynamic>' 不是类型 'Map<String, dynamic>' 的子类型

Dart 未处理的异常:类型 'List<dynamic>' 不是类型 'Family' 的子类型,- Flutter

未处理的异常:类型“List<dynamic>”不是“List<CustomerTransactionDetail>”类型的子类型

未处理的异常:类型'List<dynamic>'不是'String'类型的子类型无法获取json数据[重复]

未处理的异常:类型“ImmutableMap<String, dynamic>”不是类型转换中“List<dynamic>”类型的子类型

未处理的异常:类型“List<dynamic>”不是 dart/flutter 中“Map<String, dynamic>”类型的子类型