无法显示来自 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
我的目标是能够显示所有酒店名称。
我很久以前用类似的 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
您能否在答案中显示新代码。
我将代码放在答案中,如果您检查过编辑历史记录,请确认
你能把你的代码放在你的问题中吗?
您使用最新代码得到的新错误信息是什么?以上是关于无法显示来自 firebase 实时数据库的数据,错误列表<Object?> 不是 Map<dynamic,dynamic> 的子类型的主要内容,如果未能解决你的问题,请参考以下文章
ListView 显示来自 Firebase 问题的所有数据
我想从firebase实时数据库中显示recyclerview android上的数据..但我无法将动态数据加载到适配器数组中
无法从firebase实时数据库检索数据到recyclerview [重复]