flutter - StreamGroup.merge仅重新调整一个流

标签 flutter dart

我显然误会了StreamGroup.merge的工作方式或流的工作方式或两者!我有两个流在Firestore中查询同一字段。我正在使用merge使一个流称为mergedStream。在streamBuilder中用于服务该应用程序。
这是我的代码:

Stream<List<Order>> stream1({Order order})  {
    return _service.collectionStream(
        path: APIPath.orders(),
        queryBuilder: (query) =>
            query.where('orderStatus', isEqualTo: 'Pending'),
        builder: (documentSnapshot) => Order.fromFirebase(documentSnapshot));
  }

  Stream<List<Order>> stream2({Order order})  {
     return _service.collectionStream(
        path: APIPath.orders(),
        queryBuilder: (query) =>
            query.where('orderStatus', isEqualTo: 'Preparing'),
        builder: (documentSnapshot) => Order.fromFirebase(documentSnapshot));
  }
以及用于流构建器的合并流:
Stream<List<Order>> mergedStream() {
    final s1 = preparingStream();
    final s2 = pendingStream();
    return StreamGroup.merge([s2, s1]);
  }
切换顺序[s2, s1]会更改显示的流。当页面加载时,我暂时看到另一个流,但它消失了,另一个流出现了。我如何合并这些流...?
编辑:我添加flutter标签,因为阅读它周围可能是StreamBuilderproblem
编辑:这有所帮助:(在评论中的链接,并且仅仅是流合并的概念证明)但是,当他的一个流中的状态发生变化时,流searchResult()不会更新...您必须刷新浏览器。 ( flutter 网)
Stream<List<Order>> searchResult() {
    List<Stream<List<Order>>> streamList = [stream1(), stream2()];

    var x = Rx.merge(streamList).scan<List<Order>>((acc, curr,i) {
      return acc ?? <Order>[]
        ..addAll(curr);
    });
    //this test shows that the stream gets contents from both query streams
    // x.map((convert){ convert.documents.forEach((f){print(f.data["name"]);});}).listen(print);

    return x;
  }

最佳答案

StreamGroup.merge将流合并为一个统一的流,但是它不会合并每个流的内容,因此,您实际上看到的是stream1或stream2的内容一个接一个。
我建议使用StreamZip,它将两个流的内容组合在一起,然后将其作为新值来发出(第一个列表包含每个流发出的第一个值,第二个列表包含第二个值,依此类推)。

Stream<List<List<Order>>> mergedStream() {
    final s1 = preparingStream();
    final s2 = pendingStream();
    return StreamZip([s2, s1]);
  }
//This will give you a List with all the emmited values of each stream, in this case a List of List<Order>
如果您想使用Rx软件包,我建议ZipStreamCombineLatestStream
import 'package:rxdart/rxdart.dart';


Stream<List<Order>> get combineList{
  final s1 = preparingStream();
  final s2 = pendingStream();
  return ZipStream.zip2<<List<Order>>, <List<Order>>, <List<Order>>>(
    s1, s2, (firstOrder, secondOrder) => <Order>[...firstOrder, ...secondOrder]); //here you combine both in a list
}
Zip和Combine的区别在于Zip在执行操作之前先等待所有内部流发出(s1的第一个发射值和s2的第一个发射值,依此类推),而combine不在乎顺序,如果发出一个的s1和s2的3,那么它将执行[s1.1, s2.1] [s1.1, s2.2] ...

关于flutter - StreamGroup.merge仅重新调整一个流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62970003/

相关文章:

android - 找不到参数的方法 android() ... flutter.gradle 问题

dart - SliverAppBar 和 Listview 与 Controller

flutter - 通过状态(提供者/消费者)更新 TextField/TextEditingController

flutter - 如何使 ListView 的子项占用 Flutter 中固定高度的容器内的所有空间

flutter - 当我滚动时,ListView 会上下移动 - flutter

firebase - Flutterfire ios 配置问题

android - 如何为 flutter 绘图应用程序实现橡皮擦功能

firebase - FLUTTER 应用程序的 Firestore 中的 ValueEventListener 等效项是什么

flutter - 如何通过 Flutter 中的 url 从网络图像中获取 Uint8List?

dart - Angular2 Dart : Dividing a project in packages does not allow to reuse base components with modified providers