将“地图<字符串,列表<字符串>>”转换为“地图<字符串,列表<字符串>>”

时间:2020-04-03 15:02:55

标签: flutter dart

我想将Map<String, dynamic>投射到Map<String, List<String>>

我已经在Flutter中尝试了以下方法:

Map<String, dynamic> dynamicMap = {
  'a': ['1', '2', '3'],
  'b': ['1', '2', '3'],
  'c': ['1', '2', '3'],
};
Map<String, List<String>> typedMap = dynamicMap;

但是出现以下错误:

type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<String, List<String>>'

然后我尝试:

Map<String, List<String>> typedMap = dynamicMap.cast<String, List<String>>();

这似乎可以正常工作,但是尝试使用它时会遇到相同的错误,例如print(typedMap)

感谢您的帮助。

编辑

值得一提的是以下内容:

Map<String, dynamic> dynamicMap = {
  'a': ['1', '2', '3'],
  'b': ['1', '2', '3'],
  'c': ['1', '2', '3'],
};
Map<String, List<String>> typedMap = dynamicMap.cast<String, List<String>>();

实际上没有做过(对问题中的错误表示歉意。)

但是,当数据来自json时,就像这样:

String rawJson = """{
   "a": ["1", "2", "3"],
   "b": ["1", "2", "3"],
   "c": ["1", "2", "3"]
}""";
final Map<String, dynamic> dynamicMapFromJson = json.decode(rawJson);
Map<String, List<String>> typedMap = dynamicMapFromJson.cast<String, List<String>>();

该代码不再起作用,并引发了提到的异常。

以下答案有助于解决此问题。

3 个答案:

答案 0 :(得分:1)

Map<String, dynamic> dynamicMap = {
  'a': ['1', '2', '3'],
  'b': ['1', '2', '3'],
  'c': ['1', '2', '3'],
};
Map<String, List<String>> typedMap;
dynamicMap.forEach((key,value){
 List<String> list = List.castFrom(value);
 typedMap[key] = list
});

这是因为可以在运行时为动态数据类型变量分配任何数据类型。 但是这里的typedMap的值已经用List<String>的数据类型声明了,除了List<String>之外没有其他可以分配的值。 该错误是因为您试图将动态数据类型分配给List<string>数据类型,这是一个伪示例

String s = dynamic(); //impossible
dynamic s = String(); //possible

答案 1 :(得分:1)

地图方法可以帮助您进行所需的转换。

查看跟踪代码。

我还演示了如何以列表的形式访问map的所有值。我希望这对您有用。

Map<String, dynamic> dynamicMap = {
    'a': ['1', '2', '3'],
    'b': ['1', '2', '3'],
    'c': ['1', '2', '3'],
};
Map<String, List<String>> typedMap =
    dynamicMap.map((key, value) => MapEntry(key, value));

typedMap.forEach((key, value) {
    print(value[0]);
});

答案 2 :(得分:0)

我最终使用的最可靠的解决方案是:

Map<String, List<String>> typedMap = dynamicMap.map(
  (key, value) => MapEntry(key, List.castFrom(value))
);

感谢@Viren V Varasadiya和@iamyadunandan提供帮助