繁体   English   中英

如何将不同的 firebase 查询流组合成一个 stream?

[英]How to combine to different firebase query streams into one stream?

我在尝试创建聊天应用程序时遇到了障碍。 我想将两个不同的流合并为一个,以创建我的聊天屏幕。 例如-

如果user1user2发送消息,它将被存储在 -

FirebaseFirestore.instance.collection("users").doc(user1).collection("data").doc(user2).collection("chats")

同样,如果user2user1发送消息,它会存储在 -

FirebaseFirestore.instance.collection("users").doc(user2).collection("data").doc(user1).collection("chats")

用户发送的所有聊天都存储在聊天集合中,位于名为接收者 uid 的文档中。

所以本质上,我需要数据 insede- FirebaseFirestore.instance.collection("users").doc(user1).collection("data").doc(user2).collection("chats") (发送聊天由 user1 发送给 user 2) 和FirebaseFirestore.instance.collection("users").doc(user1).collection("data").doc(user2).collection("chats") (获取 user2 发送给 user1 的聊天记录) 创建聊天屏幕。

我想知道如何将这两个流合并为一个,这样我就可以使用这些数据来创建聊天小部件。 到目前为止,这就是我所拥有的-

注意:继续类比, user1的 uid 是FirebaseAuth.instance.currentUser..uid ,而user2的 uid 存储在widget.uid中。

StreamBuilder(
          //To get messaages sent by the current user to user2 or widgets.uid
          stream: FirebaseFirestore.instance
              .collection("users")
              .doc(FirebaseAuth.instance.currentUser!.uid)
              .collection("data")
              .doc(widget.uid)    
              .collection("chats")
              .snapshots(),
          builder: (context,
              AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>
                  UserMessagesSnapshots) {
            if (UserMessagesSnapshots.connectionState ==
                ConnectionState.waiting) {
              return const LoadingScreen();
            } else {

              return StreamBuilder(
                  //to get messages sent by user2 to user1
                  stream: FirebaseFirestore.instance
                      .collection("users")
                      .doc(widget.uid)
                      .collection("data")
                      .doc(FirebaseAuth.instance.currentUser!.uid)
                      .collection("chats")
                      .snapshots(),
                  builder: (context,
                      AsyncSnapshot<QuerySnapshot<Map<String, dynamic>>>
                          FriendMessagesSnapshot) {
                    if (FriendMessagesSnapshot.connectionState ==
                        ConnectionState.waiting) {
                      return const LoadingScreen();
                    } else {
                         //and here i have both the streams. 
                    }
                  });
            }
          },
        ),

谢谢@mariofrancios!

我创建了这个 function 将流合并到一个-

Stream<List<QuerySnapshot>> getMessages() {
    Stream userMessages = FirebaseFirestore.instance
        .collection("users")
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .collection("data")
        .doc(widget.uid)
        .collection("chats")
        .snapshots();
    Stream friendMessages = FirebaseFirestore.instance
        .collection("users")
        .doc(widget.uid)
        .collection("data")
        .doc(FirebaseAuth.instance.currentUser!.uid)
        .collection("chats")
        .snapshots();
    return StreamZip([(userMessages as dynamic), (friendMessages as dynamic)]);
  }

然后像这样听着——

...StreamBuilder(
          stream: getMessages(),
          builder: (context, AsyncSnapshot<List<QuerySnapshot>> snap) {
            if (snap.connectionState == ConnectionState.waiting) {
              return const LoadingScreen();
            } else {
              // access the data with snap.data![n].docs[n].data()
            }
          },
        ),

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM