【问题标题】:Dart - how _InternalLinkedHashMap<String, dynamic> convert to Map<String, dynamic>?Dart - _InternalLinkedHashMap<String, dynamic> 如何转换为 Map<String, dynamic>?
【发布时间】:2020-01-10 17:00:06
【问题描述】:

我在我的颤振应用程序中使用package dio。从我的 api 问题中得到答复。 response.data 获取类型 _InternalLinkedHashMap&lt;String, dynamic&gt;。我需要将此值转换为Map&lt;String, dynamic&gt;。我尝试了很多选项,但这不起作用。

我无法更改服务器响应。有什么建议吗?

【问题讨论】:

    标签: json flutter dart


    【解决方案1】:

    试试这个:

    Map<String, dynamic>.from(yourData)
    

    【讨论】:

    • 这行得通,但它不应该是必要的而且是浪费的。
    • 从函数返回 Map 时不会浪费。返回 _InternalLinkedHashMap 代替 Map 会出现错误:A value of type 'LinkedHashMap&lt;dynamic, dynamic&gt;' can't be returned from method 'predict' because it has a return type of 'Future&lt;Map&lt;String, dynamic&gt;&gt;'. 使用 Map&lt;String, dynamic&gt;.from(yourData) 允许此返回。
    • @StuckInPhD 您的示例使用不同的参数化类型,因此需要进行转换。当参数化类型相同时,如原始问题中所述,通过创建不必要的副本进行转换是浪费的。
    • 我从 Java 端获取了一张地图发送到 dart 端,我必须这样做Map&lt;String, dynamic&gt;.from(call.arguments as Map&lt;Object?, Object?&gt;
    【解决方案2】:

    _InternalLinkedHashMap&lt;K, V&gt;Map&lt;K, V&gt; 之间不需要做任何转换:前者已经是后者的子类型。

    void main() async {
      final map = <String, int>{};
      print(map.runtimeType);
      print('${map is Map<String, int>}');
    }
    

    打印:

    _InternalLinkedHashMap<String, int>
    true
    

    (构造LinkedHashMapMap's default constructor is a factory constructorLinkedHashMap的默认构造函数也是工厂构造函数,Dart VM的实现构造并返回内部_InternalLinkedHashMap对象。)


    请注意,仅当_InternalLinkedHashMap&lt;K, V&gt; 使用与Map 相同的KV 时才适用。如果它们在不同类型上被参数化,那么您将需要执行显式转换,但不是这个问题中提出的情况。 p>

    【讨论】:

    • 如果这是真的,我们就不会出错。
    • @DanielVilela 请告诉我错误。我看到的所有错误都是 _InternalLinkedHashMapMap不同 类型上参数化的情况,这与此问题中所问的情况不同。如果您认为我写的不是真的,请运行代码并显示不同的输出。
    • 现在@diegoveloper 的答案在这里起作用了。但对我来说,当我为 firebase 和 meilisearch 使用云功能时,就会出现这个错误。我的回应是这个 _linkedHashMap 的东西,我无法从中创建 fromJson(),我期望 Map 在那里。它抛出了一个错误并把我带到了stackoverflow。
    • 正如我所怀疑的,您描述的问题与此问题所问的问题不同。 T&lt;dynamic, dynamic&gt;T&lt;String, dynamic&gt; 不同。
    • 不,不应该。 _InternalLinkedHashMap&lt;dynamic, dynamic&gt; 可以采用任何类型的键。 Map&lt;String, dynamic&gt; 只能以 Strings 作为键。因此_InternalLinkedHashMap&lt;dynamic, dynamic&gt; 不是Map&lt;String, dynamic&gt; 的更具体类型。
    【解决方案3】:

    我是怎么做的,我是使用 _InternalLinkedHashMap 将 HashMap 转换为 HashMap

    var map = HashMap.from(value) // value is _InternalLinkedHashMap <dynamic, dynamic>
    

    从这里我可以获取类方法来将地图转换为我的对象,以便我可以在代码中使用它,就像这样

    User.fromJson(map) //  this return User object 
    

    您可以使用 website 直接从 JSON 生成 Dart 模型类。

    这里是User.Json方法的代码sn-p:

    SeatBookingModel.fromJson(Map<String, dynamic> json) {
    userName= json['userName'];
    userEmail= json['userEmail'];
     }
    

    快乐编码

    【讨论】:

    • 在这种情况下您需要进行显式转换的唯一原因是您使用的是HashMap。如果您改用LinkedHashMap(或Map),则无需转换。
    猜你喜欢
    • 1970-01-01
    • 2021-03-27
    • 1970-01-01
    • 2023-03-27
    • 2021-03-25
    • 2021-04-03
    • 1970-01-01
    • 2019-04-03
    • 2019-05-02
    相关资源
    最近更新 更多