【问题标题】:Flutter - How to Merge Two Stream in Flutter ? Why I'a getting Only Last Stream?Flutter - 如何在 Flutter 中合并两个流?为什么我只有最后一个流?
【发布时间】:2020-12-14 09:59:16
【问题描述】:

我想在 Futter 中合并两个 Firestore 流。我尝试了很多方法但在某些情况下,我得到了一个错误,其他人只返回最后一个流,而不是合并的流。这是我的代码

class Classes extends StatefulWidget {
  @override
  _ClassesState createState() => _ClassesState();
}

class _ClassesState extends State<Classes> {
  String path0 = "class_schedule/Classes";
  String path1 = "users/R2z6mt5/Classes";
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: StreamBuilder(
          stream: Rx.merge([
            Firestore.instance.collection(path1).snapshots(),
            Firestore.instance.collection(path0).snapshots()
          ]),
          builder: (context, snapshot) {
            return !snapshot.hasData
                ? Text('PLease Wait')
                : ListView.builder(
                    itemCount: snapshot.data.documents.length,
                    itemBuilder: (context, index) {
                      DocumentSnapshot items = snapshot.data.documents[index];
                      return Padding(
                        padding: const EdgeInsets.all(8.0),
                        child: Container(
                          color: Colors.yellow,
                          height: 50,
                          width: double.infinity,
                          child: Center(
                            child: Text(
                              items['Course'],
                              style: TextStyle(
                                fontSize: 24,
                              ),
                            ),
                          ),
                        ),
                      );
                    },
                  );
          }),
    );
  }
}

请告诉我如何解决这个问题?

提前致谢

【问题讨论】:

  • “我遇到错误” - 我没有看到任何错误
  • @pskink 我想合并,但它只显示最后一个流。
  • 你遇到了什么错误?您在日志中看到了什么?
  • @pskink 如果我使用 StreamZip,则不在 Rx.merge 中,然后我得到“类 'List' 没有实例获取器 'documents'。接收者:'_GrowableList' 的实例(长度:2)尝试调用:文档“

标签: flutter dart


【解决方案1】:

您可以使用此library 将两个流合并在一起。请参阅文档以更好地理解。

【讨论】:

  • StreamZip ??我试过了它不适合我
  • 确保将异步添加到您的依赖项中
  • 是的。谢谢这个图书馆为我工作@lenz
【解决方案2】:

根据docsStreamZip

[E]mits 从每个输入流收集的值列表。第一份名单 包含每个流发出的第一个值,第二个包含 第二个值,依此类推。

因此,您的代码中snapshot.data 的类型是List&lt;QuerySnapshot&gt;,它显然没有documents getter。您可以像这样访问第一个QuerySnapshotsnapshot.data[0],然后调用documents。同样,第二个是snapshot.data[1],等等。

【讨论】:

  • 感谢它对我有用@Riwen
【解决方案3】:

如果我使用 StreamZip,那么我得到“类 'List' 没有实例 getter 'documents'。接收者:'_GrowableList' 的实例(长度:2)尝试调用:文档”

这是因为当你与 StreamZip 合并时,每个流事件都会是一个列表, 例如,如果 2 个流 A 和 B 发出 int,将它们与 StreamZip 合并将发出长度为 2 的 List&lt;int&gt;,索引 0 将是流 A 的事件,索引 1 将是流 B 的事件,所以你需要像zippedStreamEvent[0].docszippedStreamEvent[1].docs一样访问它们

让我给你一个代码示例

StreamBuilder<List<QuerySnapshot>>(
    stream: yourZippedStream,
    builder: (_, snap) {
      if(!snap.hasData){
        return CircularProgressIndicator();
      }
      final allDocs = [...snap.data[0].docs, snap.data[1].docs];
      return ListView.builder(itemBuilder: (_, i) {
        final doc = allDocs[i];
        return YourListWidget();
      });
    },
  );

【讨论】:

  • 可以告诉我如何在我的代码上实现它。如果可以的话对我有帮助
猜你喜欢
  • 2019-04-16
  • 2021-03-26
  • 1970-01-01
  • 2021-06-05
  • 2020-03-20
  • 1970-01-01
  • 2019-04-02
  • 2018-07-30
  • 1970-01-01
相关资源
最近更新 更多