【问题标题】:Get Map<String, dynamic> from Map<dynamic, dynamic> flutter从 Map<dynamic, dynamic> 中获取 Map<String, dynamic>
【发布时间】:2021-09-25 11:49:05
【问题描述】:

我有以下代码:

 Map<dynamic, dynamic> result = snapshot.value;
 Map<String, dynamic> data = Map<String, dynamic>();
 for (dynamic type in result.keys) {
    data[type.toString()] = result[type];
 }
 print(data);
 print(data.runtimeType);

但是数据类型是_InternalLinkedHashMap&lt;String, dynamic&gt;,我无法读取它的值,尽管我在上面做了丑陋的黑客攻击。

直接投射也不起作用:snapshot.value as Map&lt;String, dynamic&gt; 抛出错误:'_InternalLinkedHashMap&lt;Object?, Object?&gt;' is not a subtype of type 'Map&lt;String, dynamic&gt;'

我需要一个 Map 类型才能创建我的自定义类 Object。

snapshot.value 有一种动态类型,但它是一个返回实时数据库查询结果的 json 对象,并且没有关于如何将值检索到 Flutter 对象中的文档。

我已经尝试过这个answer,但我不能使用它,因为jsonDecode() 需要一个字符串作为参数。

【问题讨论】:

    标签: firebase flutter dart firebase-realtime-database


    【解决方案1】:

    最近的Firecast video 在 27 分钟解决了我的问题。

    我的数据模型对象中的另一个嵌套 HashMap 也有一个非显式 Flutter 错误,无法直接转换。

    解决方案是使用Map&lt;String, dynamic&gt;.from(snapshot.value),这适用于数据模型对象中的每个嵌套Map

    【讨论】:

      【解决方案2】:

      我使用 DartPad 测试了您的代码:

      void main() {
        //Custom json
        Map<dynamic, dynamic> json = {
          "window": {
            "title": "Sample Konfabulator Widget",
            "name": "main_window",
            "width": 500,
            "height": 500
          }
        };
      
        Map<dynamic, dynamic> result = json;
        Map<String, dynamic> data = Map<String, dynamic>();
        for (dynamic type in result.keys) {
          data[type.toString()] = result[type];
        }
        print(data);
        print(data['window']);
        print(data['window']['title']);
      }
      

      打印 1:

      {window: {title: Sample Konfabulator Widget, name: main_window, width: 500, height: 500}}

      打印 2:

      {title: Sample Konfabulator Widget, name: main_window, width: 500, height: 500}

      打印 3:

      Konfabulator 小部件示例

      我不明白这个问题

      【讨论】:

      • 我有一个factory Groups.fromJson(Map&lt;String, dynamic&gt; json) {} 方法,它以 Map 为参数。事实上,data 变量包含我想要的内容,但不可能使用它来创建我的自定义类之一,因为它不是“正确的类型”。我更喜欢避免 data 上的任何循环来构建自己的 Groups 对象的每个字段...
      【解决方案3】:

      这将递归地将 Map 转换为 Map

      Map<String, dynamic> dynamicMapToString(Map<dynamic, dynamic> data) {
        List<dynamic> _convertList(List<dynamic> src) {
          List<dynamic> dst = [];
          for (int i = 0; i < src.length; ++i) {
            if (src[i] is Map<dynamic, dynamic>) {
              dst.add(dynamicMapToString(src[i]));
            } else if (src[i] is List<dynamic>) {
              dst.add(_convertList(src[i]));
            } else {
              dst.add(src[i]);
            }
          }
          return dst;
        }
      
        Map<String, dynamic> retval = {};
        for (dynamic key in data.keys) {
          if (data[key] is Map<dynamic, dynamic>) {
            retval[key.toString()] = dynamicMapToString(data[key]);
          } else if (data[key] is List<dynamic>) {
            retval[key.toString()] = _convertList(data[key]);
          } else {
            retval[key.toString()] = data[key];
          }
        }
        return retval;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-04-13
        • 2021-07-14
        • 2021-09-11
        • 2021-02-11
        • 2020-01-10
        • 2023-03-27
        • 2021-08-29
        • 2021-10-02
        • 2019-04-03
        相关资源
        最近更新 更多