首页 > 解决方案 > 无法显示来自 firebase 实时数据库的数据,错误列表不是 Map 的子类型

问题描述

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

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

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

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

当我把小路放在酒店的上一层时,

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

它无法提取数据并返回错误“类型 'List<Object?>' 不是类型 'Map<dynamic,dynamic>' 的子类型”。我显然确实更改了代码以说明它更高一层。所以我知道它不是因为它仍然期待完整的路径。

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

我很久以前用类似的 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);
});

标签: androidflutterfirebase-realtime-database

解决方案


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

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

forEach之后也应该工作。


推荐阅读