android - 无法显示来自 firebase 实时数据库的数据,错误列表
问题描述
我正在尝试使用 firebase 我的 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);
});
解决方案
原因是它Hotels
已经是一个列表,而不是你可以转换为 .json 的 json 对象Map
。要使您的代码正常工作,只需将类型更改为 a List
:
List<dynamic> values = snapshot.data.value;
forEach
之后也应该工作。
推荐阅读
- xcode - Xcode中是否提供此类工具
- android - 在后台每隔一分钟重复一个功能,颤动
- javascript - 重新排列json生成的表格列顺序
- javascript - 使用 Selenium 从远程页面检索隐藏文本
- python - Python - 有没有办法对包含日期和时间的字符串列表进行排序
- javascript - 用户输入后没有警报输出
- html - 单击整个输入类型时间 HTML5 字段时不仅在小时钟图标上显示时间选择器
- titanium - Appcelerator:如何更改钛合金的 IOS 模拟器?
- postgresql - 如何检查多线串是否真的是多线串?
- javascript - 如何解决 npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.13