【问题标题】:Cast "Map<String, List<dynamic>>" to "Map<String, List<String>>"将“Map<String, List<dynamic>>”转换为“Map<String, List<String>>”
【发布时间】:2020-04-03 15:02:55
【问题描述】:

我想将Map&lt;String, dynamic&gt; 转换为Map&lt;String, List&lt;String&gt;&gt;

我在 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>>();

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

下面的答案有助于解决这个问题。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    Map方法可以帮助你转换你的愿望。

    查看后续代码。

    我还演示了如何以列表的形式访问 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]);
    });
    

    【讨论】:

    • 你试过会给两个变量吗?它工作正常。我在发布之前进行了测试。
    • 我的意思是,您的代码没有显示如何创建动态地图。
    • 正如问题所述,我已经尝试过了,但是您收到以下错误:type '_InternalLinkedHashMap&lt;String, dynamic&gt;' is not a subtype of type 'Map&lt;String, List&lt;String&gt;&gt;' when in Flutter.
    • 你能添加你在我的代码中所做的更改,它会给你错误
    • 是的,可能是因为我是用手机编辑的。我希望现在这对你有用。
    【解决方案2】:
    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&lt;String&gt; 的数据类型声明了,除了List&lt;String&gt; 之外,没有其他东西可以分配给它。 错误是因为您试图将动态数据类型分配给 List&lt;string&gt; 数据类型,这是一个伪示例

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

    【讨论】:

    • 口头解释通常很有帮助
    • dynamic 可以是任何 int、string、double、任何随机对象,但 typedaMap 要求它是字符串列表而不是动态类型,但你给它的是动态的。
    • 为将来的目的编辑了答案
    【解决方案3】:

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

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

    感谢@Viren V Varasadiya 和@iamyadunandan 的帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-01
      • 2016-07-21
      • 1970-01-01
      • 1970-01-01
      • 2015-11-21
      • 2021-12-21
      相关资源
      最近更新 更多