You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter下从Firestore获取的评论无法按timestamp时间戳升序排序

错误原因
  • 集合查询路径错误:你写入评论时的路径是users/${authorId}/recpies/${recipeId}/comments子集合,但读取数据时直接在Firestore根实例调用orderBy,没有定位到正确的评论集合,查询到的不是目标评论数据,排序自然不会生效。
  • API混淆:orderByChild是Firebase Realtime Database的查询API,你当前使用的是Cloud Firestore,只能用orderBy做排序,无法调用orderByChild属于正常情况。
修复步骤
  1. 修正查询路径,保证读写的是同一个集合
  2. (可选优化)写入时间戳时用Firestore服务端时间,避免客户端本地时间不准导致的排序异常
  3. 若首次查询排序时报索引缺失错误,按照控制台提示创建对应索引即可

修正后的代码

优化后的新增评论逻辑

addComment(String com) async {
  final commentRef = Uuid().v4();
  FirebaseFirestore.instance
      .collection("users")
      .doc(authorId)
      .collection("recpies")
      .doc(recipeId)
      .collection("comments")
      .doc(commentRef)
      .set({
    "username": userUsername,
    "reciepeId": "2cf0fbeb-957a-4330-96b3-36bc2fbfe080",
    "imageUrl": imageURL,
    "timestamp": FieldValue.serverTimestamp(), // 替换本地DateTime用服务端时间,排序更准确
    "shownDate": DateFormat('yyyy-MM-dd – hh:mm:a').format(DateTime.now()),
    "comment": com,
  });
}

修正后的查询逻辑

getData(){
  // 补全和写入逻辑一致的集合路径
  FirebaseFirestore.instance
      .collection("users")
      .doc(authorId)
      .collection("recpies")
      .doc(recipeId)
      .collection("comments")
      .orderBy('timestamp', descending: false)
      .snapshots()
      .listen((data) {
    setState(() {
      comments.clear(); 
      data.docs.forEach((doc) {
        comments.add(commentState(
          username: doc["username"],
          commentImgUrl: doc["imageUrl"],
          comment: doc["comment"],
        ));
      });
    });
  });
}

@override
void initState() {
  super.initState();
  getData(); 
}

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 21:24:07