获取 Map<String, Element>而不是 Map<dynamic, dynamic>



我们从元素周期表成员的类Element开始。

import 'dart:convert' as JSON;
class Element {
String name;
Element({this.name = ""});
String toString() {
return this.name.toString();
}
}

然后我们可以解码JSON字符串

void f1() {
var jsonStr = """{ "Na": { "name": "Sodium" }, "Ca": { "name": "Calcium" } }""";
final json = JSON.jsonDecode(jsonStr);
print(json.runtimeType);  // MappedListIterable<dynamic, dynamic>
final elements = json.map((key, value) => MapEntry(key, Element(name: value['name'])));

print(elements.runtimeType);  // _InternalLinkedHashMap<dynamic, dynamic>
}

但假设我们想要指定结果的类型:

Map<String, Element> f3() {
var jsonStr = """{ "Na": { "name": "Sodium" }, "Ca": { "name": "Calcium" } }""";
final json = JSON.jsonDecode(jsonStr);
final elements = Map<String, Element>.fromIterable(json,
key: (k, v) => k,
value: (k, v) => Element.fromJson(name: v['name'])
);
return elements;
}

如何避免以下错误?

Error: The argument type 'String Function(dynamic, dynamic)' can't be assigned
to the parameter type 'String Function(dynamic)?'.

以确保返回的对象的类型为Map<String, Element>

Map<K, V>.fromIterable的签名是:

Map<K, V>.fromIterable(
Iterable iterable,
{K key(
dynamic element
)?,
V value(
dynamic element
)?}
) 

注意,key:value:都只接受一个参数的函数。key的想法是从您的迭代中提取一个元素,并从中生成Key——在您的情况下,是String。然后,对于value回调,您使用相同的元素并从中生成Value——在您的情况下,是Element

此外,映射是不可迭代的,但map.entries是,因此您需要迭代json.entries,而不仅仅是json

因此,以下内容应该可以完成任务:

final elements = Map<String, Element>.fromIterable(json.entries,
key: (entry) => entry.key,
value: (entry) => Element(name: entry.value['name']),
);

相关内容

最新更新