【发布时间】:2020-01-10 17:00:06
【问题描述】:
我在我的颤振应用程序中使用package dio。从我的 api 问题中得到答复。
response.data 获取类型 _InternalLinkedHashMap<String, dynamic>。我需要将此值转换为Map<String, dynamic>。我尝试了很多选项,但这不起作用。
我无法更改服务器响应。有什么建议吗?
【问题讨论】:
我在我的颤振应用程序中使用package dio。从我的 api 问题中得到答复。
response.data 获取类型 _InternalLinkedHashMap<String, dynamic>。我需要将此值转换为Map<String, dynamic>。我尝试了很多选项,但这不起作用。
我无法更改服务器响应。有什么建议吗?
【问题讨论】:
试试这个:
Map<String, dynamic>.from(yourData)
【讨论】:
Map 时不会浪费。返回 _InternalLinkedHashMap 代替 Map 会出现错误:A value of type 'LinkedHashMap<dynamic, dynamic>' can't be returned from method 'predict' because it has a return type of 'Future<Map<String, dynamic>>'. 使用 Map<String, dynamic>.from(yourData) 允许此返回。
Map<String, dynamic>.from(call.arguments as Map<Object?, Object?>。
_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
(构造LinkedHashMap的Map's default constructor is a factory constructor。LinkedHashMap的默认构造函数也是工厂构造函数,Dart VM的实现构造并返回内部_InternalLinkedHashMap对象。)
请注意,仅当_InternalLinkedHashMap<K, V> 使用与Map 相同的K 和V 时才适用。如果它们在不同类型上被参数化,那么您将需要执行显式转换,但不是在这个问题中提出的情况。 p>
【讨论】:
_InternalLinkedHashMap 和 Map 在 不同 类型上参数化的情况,这与此问题中所问的情况不同。如果您认为我写的不是真的,请运行代码并显示不同的输出。
T<dynamic, dynamic> 与 T<String, dynamic> 不同。
_InternalLinkedHashMap<dynamic, dynamic> 可以采用任何类型的键。 Map<String, dynamic> 只能以 Strings 作为键。因此_InternalLinkedHashMap<dynamic, dynamic> 不是Map<String, dynamic> 的更具体类型。
我是怎么做的,我是使用 _InternalLinkedHashMap
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),则无需转换。