Flutter Stream构建器不能很好地处理合并的流

问题描述

我设法将2个数据流(在我的应用程序中,我希望在此特定页面上合并2个以上的数据流)合并为一个我命名为groupedStream的流,并且该流被馈送到我的StreamBuilder。

但是,问题在于显示数据。它仅显示来自其中一个流的数据。但是,如果我将一个打印功能一个字符串一起使用,我可以看到该字符串被打印的确切次数是我期望的。

让我再解释一下。我在Firestore上有一个publicFeed集合,其中保存了在我的应用程序中发布内容的人员的帖子。当关注者打开此特定页面时,应用程序将获取他的关注者列表(他关注的人),并使用其每个publicFeed集合创建合并的流,并将所有这些数据通过管道传递到单个列表视图中。这样用户可以看到他们最近发布的所有内容。我认为,与为每个关注者的个人“ privateFeed”集合编写应用程序相比,该系统要好得多,更快,更便宜且更具可伸缩性,因为可以想象拥有200万关注者的人。那是200万次写入,后来是200万次读取。

因此,请记住,我以myusers中的两个身份登录并发布了一些虚拟内容。每个帖子中有3个帖子,然后注销后,我使用了跟随这两个帖子的帐户登录,以查看流合并是否有效。可悲的是,它只向我显示其中一个的帖子。 但该打印显示6张照片。 当我打印出正在打印的正在处理的帖子的ID时,我发现它与显示的帖子完全相同。 但是我发现这个数字与我希望在页面上看到的帖子总数完全匹配很奇怪。

我如何使流生成器正常工作?我整天都在搜寻互联网,但是找不到它。

相关代码如下:

这是用于查找当前用户遵循的人员列表的代码:它以init状态执行。 followings是仅保留以下用户ID的String类型的列表。它或多或少没有用。 IFollowPeople是一个笨蛋,我用它来轻松检查ui是否应承受构建流构建器的压力,而别无所求,而不仅仅是显示“抱歉,您没有关注任何人。跟随人们”

 getFollowingCount() async {
followingsstreams = [];
followings = [];
try {
  await FirebaseDatabase.instance
      .reference()
      .child("following")
      .child(uid)
      .once()
      .then((value) {
    if (value.value != null) {
      int count = 0;
      Map<dynamic,dynamic> followaz = new Map();
      followaz = value.value;
      followaz.forEach(
        (key,value) {
          print(key);
          followings.add(key);
          followingsstreams.add(Firestore.instance
              .collection("posterPublicFeed")
              .document(key)
              .collection(key)
              .snapshots());

          count++;
        },);

      if (count == followaz.length) {
        groupedStream = StreamGroup.merge(followingsstreams);
        // print(followingsstreams.toString());

        if (mounted) {
          setState(() {
            iFollowSomePeople = true;
          });
        }
      }
    }
  });
} catch (e) {
  print("error getting followers $e");
}

}

接下来是体内错误的流生成器​​。相关代码是:

StreamBuilder(
        stream: groupedStream,builder: (context,snapshot) {
          if (snapshot.hasData) {
            if (snapshot.data == null) {
              return Text("You have no posts in your private Feed yet");
            } else {     dynamic privatePosts = snapshot.data.documents;

              return ListView.builder(
                  itemCount: privatePosts.length,itemBuilder: (context,index) {
                    String postID = privatePosts[index].documentID;
                    print(postID);
                    return Container(
                      child: StreamBuilder(
                        stream: Firestore.instance
                            .collection("posts")
                            .document(postID)
                            .snapshots(),snapshot) {
                          print("I printed a post YOOOOOO.");
                          print("The postID is $postID");
                          if (snapshot.hasData) {
                            return Text("This is a post");
                          } else {
                            return Text(
                                "Post not found. Please check your internet connection");
                          }
                        },),);
                  });

              
            }
          } else {
            return Scaffold(
              body: Column(
                children: <Widget>[
                  SizedBox(
                    height: MediaQuery.of(context).size.height * 0.4,Text(
                    "Just a sec...",style: TextStyle(
                        fontSize: 16,fontWeight: FontWeight.w600),SpinKitDoubleBounce(
                    color: Colors.blue,],);
          }
        },

当我运行它时,这就是我得到的。请注意调试控制台中的“我已打印帖子”文本数以及屏幕上的文本数。还值得注意的是,该用户希望在屏幕上总共看到6个帖子。他们追踪的每个人3个。 请帮助。

Screenshot from my desktop

解决方法

我认为问题是由于StreamBuilder只会获取最新快照,并且可能会丢失一些初始快照。具体来说,它可能会丢失每个快照中的初始数据。

当新数据进入任何流时,它也应该获取这些快照。

question和此question提供了一些解决方法。