Flutter - 在聊天应用程序中实现未读消息?

Flutter - Implementing unread messages in a chat app?

我正在使用 Flutter 和 Firestore 构建一个简单的聊天应用程序。我的应用程序正在运行,但我很难实现未读消息计数器来提供导航栏。我正在使用 Badges 在“消息”图标旁边放置一个数字,但我不确定确定 Firestore 中聊天 collection 未读消息数的最佳方法。

我知道如何从我的聊天中确定未读计数 collection,但我不确定获取数据的最有效方法。我试图创建一个 Stream,但 运行 遇到了实施该方法的挑战。 这是我用来创建 Stream 的代码。我正在获取数据,但在解析数据时遇到了挑战,因此我无法确定未读计数。这是我的流代码:

FirebaseFirestore.instance.collection('chats')
    .where('users', arrayContains: currentUserReference)
    .snapshots()
    .listen((QuerySnapshot querySnapshot){
      querySnapshot.docs.forEach((document) {
        print(document.data());
      });
  }
);

flutter: {user_a: DocumentReference<Map<String, dynamic>>(users/1a305sQhd2MmQsIVsposE0AHto52), last_message_time: Timestamp(seconds=1644323419, nanoseconds=16000000), user_b: DocumentReference<Map<String, dynamic>>(users/277amBvOk4cfydxdEkZvs4Od31C2), last_message_sent_by: DocumentReference<Map<String, dynamic>>(users/1a305sQhd2MmQsIVsposE0AHto52), last_message_seen_by: [DocumentReference<Map<String, dynamic>>(users/277amBvOk4cfydxdEkZvs4Od31C2)], users: [DocumentReference<Map<String, dynamic>>(users/1a305sQhd2MmQsIVsposE0AHto52), DocumentReference<Map<String, dynamic>>(users/277amBvOk4cfydxdEkZvs4Od31C2)], last_message: are you there?}

我不确定我的 Stream 方法是否正确,我不知道如何解析上述结果以便确定未读计数。我将通过检查 'last_message_seen_by' 字段中包含 currentUser id 的实例数来确定未读计数。

对于如何完成此任务的任何指导,我将不胜感激。

这取决于, 首先的问题是,徽章编号代表未读对话的数量或对话中消息的未读总数(所有这些加起来)?

如果它表示未读对话的数量,一种方法可以是,对于每个对话的元数据,您可以设置一个变量(bool)来检查对话是否未读......我认为尽可能多您正在使用列表视图显示那些具有构建方法的对话,该方法 returns 创建列表后的每个元素...您可以在那里检查变量的值并分别增加或减少计数器。

如果徽章表示所有对话中未读消息的总和...我有一个与前一个类似的方法,在每个对话的元数据中都有一个整数来存储未读消息并在列表视图中构建对话时将它们全部加起来。

我是新手,所以我的方法,我不确定是否是最佳方法,但我认为它应该有效(显然没有免费的东西,即使我的方法也可能有未来的并发症)。