【问题标题】:Flutter type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>'Flutter 类型 \'_InternalLinkedHashMap<String, dynamic>\' 不是类型 \'List<dynamic>\' 的子类型
【发布时间】:2022-11-11 01:00:22
【问题描述】:

我是 Flutter 语言学习者,对这个世界很陌生,

我有一个像这样的json:

{
  "USDBRL":
  {
    "id": "...",
    "name": "...",...
  }
}

我的 Dolar 模型:

class Dolar {
  String param1;
  String param2;

  // Constructor
  Dolar({
    required this.param1,
    required this.param2,
  });

  factory Dolar.fromJson(Map<String, dynamic> json) {
    return Dolar(
      param1: json['param1'],
      param2: json['param2'],
    );
  }
}

我需要获取所有“USDBRL”字段,但是当我运行应用程序时,我得到“flutter: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'List<dynamic>' ”。

我已经尝试在互联网上搜索解决方案,但我尝试过的替代方案都没有奏效。

【问题讨论】:

    标签: flutter api model flutter-http


    【解决方案1】:

    当它是地图时,您错误地将“USDBRL”转换为列表。

    摆脱这一行: List&lt;dynamic&gt; body = json["USDBRL"];

    并替换为这一行: Map&lt;String, dynamic&gt; body = json["USDBRL"];

    这应该可以解决您看到的投射错误。

    要解决toList 错误,您需要更改获取Dolar 的方式。

    Dolar dolar = Dolar.fromJson(body);

    这是因为“USDBRL”不包含项目列表。它是一个具有属性和值的对象。我假设“USDBRL”中的那些值是您想要用来配置 Dolar 对象中的数据的值。因此,您只需将其更改为 Dolar 的单个实例即可从“USDBRL”映射中获取数据。

    最终代码可能如下所示:

    Future<Dolar> getDolar() async {
        try {
            Response res = await get(Uri.parse(endPointUrl));
            if (res.statusCode==200) {
                final json = jsonDecode(res.body);
                Dolar dolar = Dolar.fromJson(json["USDBRL"] as Map<String, dynamic>);
                return dolar;
            } else {
                throw ("Can't access the Dolar API");
            }
        } catch (e) {
            print(e);
            rethrow;
        }
    }
    

    【讨论】:

    • 错误:没有为类“Map<dynamic, dynamic>”定义方法“toList”。 lib/services/api_service.dart:21 -“地图”来自“dart:core”。尝试将名称更正为现有方法的名称,或定义名为“toList”的方法。 body.map((动态项) => Dolar.fromJson(item)).toList(); ^^^^^^
    • 您可能需要更新您的问题以包含 Dolar 模型并查看您尝试访问的 toList 函数。
    • 在您提出建议后,我放了一个与我的模型相同的示例并打印了当前错误
    • 您是否试图从“USDBRL”对象中获取Dolar 数据?
    • 是的,所有这些,id,name,就像我在上面放置的 json 模板中一样,将它们放入我的模型中,它具有相同的字段
    【解决方案2】:

    你可以试试这个查询。你需要用'as'定义你的类。

    final Map<String, dynamic> jsonResult = jsonDecode(response.body);
    
    List<Dolar> dolar  =  (jsonResult['USDBRL']
                  as List<dynamic>)
              .map((data) => Dolar.fromJson(data))
              .toList();
    

    fromJson 应该喜欢这个。

    factory Dolar.fromJson(Map<String, dynamic> json) {
        return Dolar(
          param1: json['id'],
          param2: json['name'],
        );
      }
    

    【讨论】:

    • 上面爸爸游戏的答案已经解决了我的问题,我也感谢你的帮助:D
    【解决方案3】:

    我在处理颤振项目时遇到了类似的问题。后来我发现问题出在我的 API 返回的数据类型上。我如何解决这个问题是将 [] 添加到我的变量中以在我将其解析为 json 之前创建一个列表。

    例如在 PHP 中 $result[] = array('a'=>$boy, 'b'=>$girl, 'c'=>$man);

    回声 json_encode($result);

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 1970-01-01
      • 2020-07-03
      • 2021-01-30
      • 2019-04-03
      • 2021-01-13
      • 2022-07-21
      • 2019-01-26
      • 2020-11-30
      相关资源
      最近更新 更多