Firebase Realtime Database在ListView.builder中数据排序异常问题
Firebase实时数据库聊天排序异常解决方案
问题描述
在移动端应用集成聊天功能时,使用Firebase Realtime Database的orderByChild("timeStamp")结合limitToLast(6)获取最新消息,调用data.values.toList()转换后数据排序异常,数据库中timeStamp属性值本身无错误。
原代码:
getStartData() async { DatabaseReference starCountRef = FirebaseDatabase.instance.ref('messages/${widget.placeID}'); starCountRef .orderByChild("timeStamp") .limitToLast(6) .onValue .listen((DatabaseEvent event) { final data = event.snapshot.value as dynamic; setState(() { list = data.values.toList(); }); }); }
问题原因
Firebase返回的查询快照是有序的,但将snapshot.value转为Map后,Dart的默认Map(HashMap)不会保留Firebase的排序顺序,直接取values.toList()会打乱原有排序。
解决方法
遍历快照的children节点(该集合保留了查询后的顺序),逐个提取数据构建列表:
修改后的代码:
getStartData() async { DatabaseReference starCountRef = FirebaseDatabase.instance.ref('messages/${widget.placeID}'); starCountRef .orderByChild("timeStamp") .limitToLast(6) .onValue .listen((DatabaseEvent event) { List<dynamic> newList = []; for (var childSnapshot in event.snapshot.children) { newList.add(childSnapshot.value); } setState(() { list = newList; }); }); }
额外检查点
确认数据库中timeStamp存储的是数值类型(如毫秒级时间戳数字),而非字符串类型——若为字符串,排序会按字典序执行,也可能导致不符合预期的结果。
内容的提问来源于stack exchange,提问作者Mohammad Abd-Elmoniem
相关产品推荐
相关产品推荐

