firebase Firestore得到的长度数据消失在Flutter流中

mjqavswn  于 2022-12-24  发布在  Flutter
关注(0)|答案(1)|浏览(118)

我用firebase的firestore聊天。
所以.我试过在聊天列表中快速不读计数.
但是,最初的数字出现,但它改变为空数据.
我不知道为什么数据改变空数据?

class ChatLength extends StatelessWidget {
  const ChatLength({super.key, required this.docId, required this.uid});

  final String docId;
  final String uid;

  @override
  Widget build(BuildContext context) {
    return StreamBuilder(
      stream: FirebaseFirestore.instance
          .collection('message_read')
          .doc(docId)
          .collection('message')
          .where('userId', isNotEqualTo: uid)
          .where('read', isEqualTo: false)
          .snapshots(),
      builder: (context, snapshot) {
        print(snapshot.data?.size);
        if (snapshot.data?.size != null) {
          return Container(
            child: Text('${snapshot.data?.size}'),
          );
        } else {
          return Container();
        }
      },
    );
  }
}
===== Debug console ====
flutter: 1 
flutter: null    //  Data changes to null immediately

1.我正在尝试从Firestore获取快照数据。
1.然后我把导入的数据放进文本中。
1.但数据立即变为空。

deyfvvtc

deyfvvtc1#

由于使用了snapshots(),代码不仅阅读数据一次,而且还继续监听数据的变化,因此您看到的两个值意味着snapshots()流被触发了两次,第一次只有一条消息,第二次没有任何消息。
我有经验的猜测是,您的代码在获取文档后更改了该文档的read值,因为它现在已经向用户显示了该消息,但这样做意味着该文档不再满足您的查询条件,因此snapshots流将获取一个新事件,其中不包含该消息。
考虑使用不同的查询机制,例如,我通常使用时间戳来确定要显示哪些消息。

  • 确保每个消息文档都有时间戳字段。
  • 对于每个用户存储(在数据库中或在应用的本地存储中),用户上次启动应用的时间。
  • 然后从数据库请求自上次启动应用程序以来的消息。
  • 请确保在更新时间戳值 * 之前 * 启动查询,否则您将永远得不到任何结果。

相关问题