如何使用Flutter按顺序读取Firebase实时数据库数据?
解决Flutter中按顺序读取Firebase实时数据库数据的问题
你当前代码的问题在于:虽然用了orderByChild('timestamps')让Firebase返回排序后的数据,但event.snapshot.value是普通Dart Map,遍历Map时无法保证顺序,导致最终列表是乱序的。
正确的实现方式
直接使用event.snapshot.children获取排序后的子节点列表,这个列表的顺序完全匹配Firebase的排序结果:
void _activateListeners() async { try { database .child('Temperature') .child(widget.sensorID) .orderByChild('timestamps') .onValue .listen((event) { temperatureList.clear(); // 清空旧数据,避免重复累积 // 遍历排序后的子节点列表 for (var child in event.snapshot.children) { var value = child.value; // 根据你的数据结构调整取值逻辑 if (value is num) { temperatureList.add(value.toDouble()); } else if (value is Map) { // 如果每个节点是包含timestamps和温度的对象,比如{"timestamps": xxx, "temp": 23.5} temperatureList.add((value['temp'] as num).toDouble()); } } setState(() {}); print('temperature $temperatureList'); }); } catch (e) { print('Error fetching temperature data: $e'); } }
关键说明
event.snapshot.children是Firebase按timestamps排序后的子节点集合,遍历它就能保证顺序。- 每次监听触发时必须清空列表,否则新数据会追加到旧列表后面,导致数据重复。
- 根据你的实际数据库结构调整取值逻辑:如果子节点直接存温度数值,就用
value.toDouble();如果是对象,就提取对应的字段(比如value['temp'])。
内容的提问来源于stack exchange,提问作者Shahriar Saem
相关产品推荐
相关产品推荐

