【问题标题】:How do I cast InternalLinkedHashMap as Map<dynamic, dynamic>?如何将 InternalLinkedHashMap 转换为 Map<dynamic, dynamic>?
【发布时间】:2019-12-19 03:54:06
【问题描述】:

我正在设置 firebase 云消息传递,在我的 onResume() 回调中,我有以下内容:

Future<void> onResume(Map<String, dynamic> message) async {
      final Map<String,dynamic> data = message['data'];
      final String url = data['url'];
      if (url != null) {
        _webViewController?.loadUrl(url);
      }
  }

函数到达时
final Map&lt;String,dynamic&gt; data = message['data'];
它会在没有警告的情况下过早地、静默地返回。

如果我改为运行
final dynamic data = message['data'];
它按预期继续。

检查message 类型会发现messageInternalLinkedHashMap 并且不能转换为Map&lt;String, dynamic&gt;

上面写着_InternalLinkedHashMap&lt;dynamic, dynamic&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;'

我该怎么做?
如果没有踪迹,以后如何找到这个问题?

【问题讨论】:

    标签: flutter dart casting firebase-cloud-messaging linkedhashmap


    【解决方案1】:

    我发现解决它的最佳方法是使用 Map.from() 并将变量类型指定为 Map:

      final Map<String, dynamic> data = Map.from(message['data']);
    
    

    【讨论】:

    • 感谢您的正确答案,我浪费了几个小时。得到这个答案。您能否建议如何获取列表
    【解决方案2】:

    试试这个:

    final Map<String,dynamic> data = Map.castFrom<dynamic, dynamic, String, dynamic>(message['data']);
    

    当然,只有当你的所有键都是真正的字符串时,你才应该这样做。

    如果你想了解发生了什么,请看这个:

    var x = {};
    print(x.runtimeType);
    Map<String, dynamic> y = Map.castFrom<dynamic, dynamic, String, dynamic>(x);
    print(y.runtimeType);
    

    【讨论】:

    • 我明白为什么String 可能是个问题,但为什么Map&lt;dynamic, dynamic&gt; 是个问题?任何HashMap 不应该能够转换为Map&lt;dynamic, dynamic&gt; 吗?
    • 但你正在做相反的事情。您不是在转换“to”,而是“from”Map&lt;dynamic, dynamic&gt;。您正在获取一个键为dynamic 的地图,并且您试图将其内容放入只接受String 键的地图中。明白了吗?
    • 在上面的例子中,是的。但是,如果我将数据更改为Map&lt;dynamic, dynamic&gt;,那么我会尝试将消息(Map&lt;String, dynamic&gt;)转换为新的变量数据(Map&lt;dynamic, dynamic&gt;)。我觉得“字符串”可以转换为“动态”?
    • 相反的工作。这行得通:Map&lt;String, dynamic&gt; x = {"a": 10, "b": true}; Map&lt;dynamic, dynamic&gt; y = x; 如果您有一些不起作用的代码,请告诉我。
    • 对,这就是我在之前的评论中想要表达的意思。如果您使用我的代码并将数据类型替换为 Map 它仍然会失败。
    【解决方案3】:

    您可以尝试将所有键映射到字符串。比如:

    final Map<String,dynamic> data = message.map((key, value) => MapEntry(key.toString(), value));
    

    【讨论】:

      猜你喜欢
      • 2020-01-10
      • 1970-01-01
      • 2018-12-01
      • 1970-01-01
      • 2021-03-27
      • 2021-08-13
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多