无法显示来自 firebase 实时数据库的数据,错误列表<Object?> 不是 Map<dynamic,dynamic> 的子类型

Posted

技术标签:

【中文标题】无法显示来自 firebase 实时数据库的数据,错误列表<Object?> 不是 Map<dynamic,dynamic> 的子类型【英文标题】:Can’t display data from firebase realtime database, Error List<Object?> is not a subtype of Map<dynamic,dynamic> 【发布时间】:2021-10-17 16:04:46 【问题描述】:

我正在尝试使用 firebase 显示来自我的实时数据库的数据 我的 JSON 结构

(是的,我知道顺序键是不好的做法,我知道它可能导致的问题,但这不是我的问题)

如果我将路径一直放在 H#,我可以显示 hName。

final testPull = FirebaseDatabase.instance.reference().child("Hotels").child("H1");

当我将路径放在酒店的上一层时,

final testPull = FirebaseDatabase.instance.reference().child("Hotels");

它无法拉取数据并返回错误“type 'List' is not a subtype of type 'Map'”。我显然确实更改了代码以说明它更高一层。所以我知道它不是因为它仍然期待完整的路径。

我的目标是能够显示所有酒店名称。

我很久以前用类似的 json 结构完成了另一个项目,我能够得到相同的结果,但现在它不适用于这个新项目。

我相信这是我在处理旧项目时关注的网站。我什至去做了和他们一样的事情,和现在一样。

https://petercoding.com/firebase/2020/02/16/using-firebase-queries-in-flutter/

按照我的旧项目编写代码。

final testPull = FirebaseDatabase.instance.reference().child("Hotels");
List<Map<dynamic, dynamic>> lists = [];
     FutureBuilder(
        future: testPull.once(),
        builder: (context, AsyncSnapshot<DataSnapshot> snapshot) 
          if (snapshot.hasData) 
            lists.clear();
            Map<dynamic, dynamic> values = snapshot.data.value;
            values.forEach((key, values) 
              lists.add(values);
            );
            return new Container(
                margin: EdgeInsets.only(left: 0.0, right: 0.0, bottom: 0.0),
                height: MediaQuery.of(context).size.height - 153,
                child: ListView (children: new List.generate( lists.length, (int index)
                  return Card(
                    child: InkWell(
                      splashColor: Colors.purple.withAlpha(30),
                      child: Container(
                        height: 40,
                        width: double.infinity,
                        child: Padding(
                          padding: EdgeInsets.all(10.0),
                          child: Column(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: <Widget>[
                              Text(lists[index]["hName"]),
                            ],
                          ),
                        ),
                      ),
                    ),
                  );
                ))
            );
          
          return CircularProgressIndicator();
        ),
    Card(
      //height: 100,
      child: InkWell(
        splashColor: Colors.purple.withAlpha(30),
        child: Container(
          height: 40,
          width: double.infinity,
          child: Padding(
            padding: EdgeInsets.all(5.0),
            child: ElevatedButton(
              onPressed: () 
                Navigator.pop(context);
              ,
              child: Text('Go back'),
            ),
          ),
        ),
      ),
    ),

感谢 Tarik Huber 的正确修复

必要的改变:

List<Map<dynamic,dynamic>> values = snapshot.data.value;

List<dynamic> values = snapshot.data.value;

还有

values.forEach((key, values) 
    lists.add(values);
);

values.forEach((key) 
    lists.add(key);
);

【问题讨论】:

【参考方案1】:

原因是Hotels 已经是一个列表,而不是一个可以转换为Map 的json 对象。要使您的代码正常工作,只需将类型更改为 List:

List<dynamic> values = snapshot.data.value;

forEach 也应该在那之后工作。

【讨论】:

当我将它从 Map 更改为 List 时,forEach 返回类型 'List>' 不能分配给参数类型 'Map ' 我什至无法运行它。如果我将 forEach 更改为 values.forEach((key) lists.add(key); ); 我可以运行它,但错误是“type '_InternalLinkedHashMap' is not a subtype of type 'List'” 您能否在答案中显示新代码。 我将代码放在答案中,如果您检查过编辑历史记录,请确认 你能把你的代码放在你的问题中吗? 您使用最新代码得到的新错误信息是什么?

以上是关于无法显示来自 firebase 实时数据库的数据,错误列表<Object?> 不是 Map<dynamic,dynamic> 的子类型的主要内容,如果未能解决你的问题,请参考以下文章

ListView 显示来自 Firebase 问题的所有数据

我想从firebase实时数据库中显示recyclerview android上的数据..但我无法将动态数据加载到适配器数组中

来自 firebase 实时数据库的重复数据

无法从firebase实时数据库检索数据到recyclerview [重复]

无法从 firebase 回收器视图中的 firebase 实时数据库中获取嵌套数据

Android微调器没有显示Firebase实时数据库数据?