Dart - 如何将_InternalLinkedHashMap<String, dynamic>转换为Map<String, dynamic>?

53
我在我的Flutter应用中使用 dio 包。从我的API获取响应后,response.data 的类型是 _InternalLinkedHashMap<String, dynamic>。我需要将这个值转换为 Map<String, dynamic> 类型。我尝试了很多方法,但都没有成功。
我无法更改服务器响应。你有什么建议吗?
4个回答

127

试试这个:

Map<String, dynamic>.from(yourData)

14
可以运作,但不应该是必需的,且有浪费的问题。 - jamesdlin
2
从函数返回“Map”时不要浪费资源。如果返回“Map”而不是返回“_InternalLinkedHashMap”,则会出现错误:“无法从方法'predict'返回类型为'Future<Map<String,dynamic>>'的值'type 'LinkedHashMap <dynamic,dynamic>'。”使用“Map<String,dynamic>.from(yourData)”可以解决此问题。 - StuckInPhDNoMore
3
@StuckInPhD 您的示例使用了不同的参数化类型,因此需要进行转换。当参数化类型相同时(如原始问题中所示),进行转换会浪费资源并创建一个不必要的副本。 - jamesdlin
3
我正在将Java端的一个地图发送到Dart端,我需要执行Map<String, dynamic>.from(call.arguments as Map<Object?, Object?>)。目的是将数据转换为Map类型,并确保键和值的类型为String和dynamic。 - Ben Butterworth
1
非常感谢。我已经试图进行强制转换了45分钟,你救了我的命:D - batuhankrbb

23

你不需要在_InternalLinkedHashMap<K, V>Map<K, V>之间进行任何转换:前者已经是后者的子类型。

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

打印:

_InternalLinkedHashMap<String, int>
true

(Map默认构造函数是一个工厂构造函数,用于构造一个LinkedHashMapLinkedHashMap的默认构造函数也是一个工厂构造函数,对于Dart VM的实现会构造并返回一个内部的_InternalLinkedHashMap对象。)


请注意,只有当_InternalLinkedHashMap<K,V>使用与Map相同的KV时,才是真正的情况。如果它们是基于不同类型进行参数化,则需要执行显式转换,但这不是该问题要求的情况。


5
如果这是真的,我们就不会收到错误信息。 - Daniel Vilela
1
现在@diegoveloper的答案在这里起作用了。但是对于我来说,当我使用Firebase和Meilisearch的云函数时,出现了这个错误。我的响应是这个_linkedHashMap,我无法从中进行fromJson(),其中我期望一个Map<string, dynamic>。它抛出了一个错误,并将我带到了stackoverflow。 - Daniel Vilela
1
_InternalLinkedHashMapMap 参数化为不同类型时,diegoveloper的回答是必要的,我猜这就是发生在你身上的情况(这也是我想看到你精确的错误信息的原因)。当它们参数化为相同类型时,使用 Map.from 是不必要的。 - jamesdlin
1
正如我所怀疑的,您描述的问题与此问题所问的不同。 T<dynamic,dynamic>T<String,dynamic>不同。 - jamesdlin
1
不应该。_InternalLinkedHashMap<dynamic, dynamic> 可以使用任何类型作为键。Map<String, dynamic> 只能使用 String 作为键。因此,_InternalLinkedHashMap<dynamic, dynamic> 不是 Map<String, dynamic> 的更具体的类型。 - jamesdlin
显示剩余7条评论

6
我是这么做的,我使用这个方法将_InternalLinkedHashMap<dynamic, dynamic>转换为HashMap:
var map = HashMap.from(value) // value is _InternalLinkedHashMap <dynamic, dynamic>

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

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

你可以通过这个网站直接从JSON生成Dart模型类。
以下是User.Json方法的代码段:
SeatBookingModel.fromJson(Map<String, dynamic> json) {
userName= json['userName'];
userEmail= json['userEmail'];
 }

愉快编码


1
在这种情况下,您需要进行显式转换的唯一原因是因为您正在使用 HashMap。如果您改用 LinkedHashMap(或 Map),则不需要进行任何转换。 - jamesdlin

5
如果你的对象深度超过一级,请尝试使用以下方法:
final Map<String, dynamic> convertedData = jsonDecode(jsonEncode(yourData));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接