StreamGroup.merge 仅重新调整一个流

2023-12-13

我显然误解了如何StreamGroup.merge工作原理或流如何工作或两者兼而有之!我有两个流正在查询 firestore 中的同一字段。我正在使用合并来创建一个名为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 标签,因为阅读它可能是problem with StreamBuilder

编辑:这有点帮助:(评论中的链接,并且只是流合并的概念证明)但是流searchResult()当其中一个流中的状态发生变化时不会更新...您必须刷新浏览器。 (颤动网络)

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的内容。

我建议使用流压缩它组合了 2 个流的内容,然后将其作为新值发出(第一个列表包含每个流发出的第一个值,第二个列表包含第二个值,依此类推)。

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 包,我会推荐ZipStream or CombineLatestStream

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并结合起来就是Zip在执行操作之前等待所有内部流发出(s1 的第一个发出值和 s2 的第一个值,依此类推),而combine不关心顺序,如果你发出 s1 和 s2 的 3 个之一,那么它就可以[s1.1, s2.1] [s1.1, s2.2] ...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

StreamGroup.merge 仅重新调整一个流 的相关文章

随机推荐

  • 如何在 app.json 中添加这些语句?

    我想使用 expo 管理的工作流程在我的应用程序中允许 HTTP 流量 如何将这些语句添加到 app json 文件中
  • SVN 使用通配符限制文件访问

    我接任一个项目的软件主管 现在负责管理该项目的 SVN 存储库 对不同部分的访问由 authz 文件控制 已经为开发人员 主管 测试人员和 cm 控制人员建立了小组 一个文件存在于我们想要限制访问的多个分支和标签中 为了锁定它 除了潜在客户
  • 在 MPI 应用程序中处理信号/正常退出

    如何在 MPI 应用程序中安全地处理信号 例如 SIGUSR1 它应该告诉应用程序其运行时间已过期 并应在接下来的 10 分钟内终止 我有几个限制 在退出应用程序之前 请先完成所有并行 串行 IO 在所有其他情况下 应用程序可以毫无问题地退
  • 在 PHP 中生成 XML 文档(转义字符)

    我正在从 PHP 脚本生成 XML 文档 并且需要转义 XML 特殊字符 我知道应该转义的字符列表 但正确的做法是什么 应该仅使用反斜杠 对字符进行转义还是正确的方法是什么 有没有内置的 PHP 函数可以帮我处理这个问题 我创建了一个简单的
  • Java 中的 StringIndexOutOfBounds

    我这里有两份完全相同的代码副本 除了一个在 for 循环中具有 错误代码 for int i 0 i lt str length i int count 0 char currentChar str charAt i for int j 0
  • 生成动画线

    x y 10 20 50 30 20 20 40 22 45 20 50 35 我想用 Net 创建动画 通常我使用 Windows 窗体 但如果需要的话 我可以使用 WPF 它从 10 20 点开始 实际上 一条线从 10 20 开始 然
  • 使用 JavaScript 删除字符串、将数字保留在数组中

    其他文章讨论根据搜索词从数组中删除字符串 但我试图确定数组中哪些元素是字符串 哪些元素是数字 然后删除所有字符串以返回一个新数组 function filter list l let newArray for let i 0 i lt l
  • 如何在vue js中使用Filepond并使用axios上传文件?

    我需要使用 axios 发送 post 请求 以便使用 Filepond Uploader 上传文件 我该怎么做 我正在使用如下所示的自定义进程处理程序 但它不起作用 processHandler fieldName file metada
  • 使用模板 10 进行依赖注入

    我正在尝试将一些代码从我使用 Prism Unity 开发的旧 Windows 8 1 应用程序迁移到使用 Template 10 和 Unity 的新 UWP 应用程序 我在模板10的文档中看到here你能行override the Re
  • 如何通过 Firebase 管理员通过代理连接到 Firebase?

    目前 我正在使用 Firebase Admin SDK 连接 NodeJS 服务器端应用程序中的 Firebase 数据库 但我没有找到通过代理设置连接 Firebase 的选项 或者它可以检测我的系统HTTP PROXY环境变量 当我运行
  • 控制android中的后退“按钮”

    我想从子活动中获取文本数据值 一切都很好 但是当子活动打开时 我只需单击手机上的后退 按钮 就会抛出异常错误 我在 android NotePad 生命周期控制 toturial 上找到了它 但它很难理解 有人能帮我吗 这是我的代码 pub
  • Entity Framework Core:在 WebAPI 中包含多对多相关对象

    我对 NET 框架不太熟悉 但决定尝试一下 ASP NET Core 和 EF Core 我想制作一个非常简单的 Web API 后端 但在处理多对多关系时遇到问题 我知道我需要为两个实体创建一个关系表 如本文中的示例所示 如何与 EF C
  • 正则表达式 - 超过 10 个字符

    如何指示需要超过 10 个字符的正则表达式 我知道 大于 0 大于 1 但是要求大于 10 的语法是什么 谢谢大家 您使用大括号表示法 例如 正则表达式a 10 将匹配 10 个或更多a人物 a 10 20 将匹配至少 10 个且不超过 2
  • 什么是 REST 资源?

    什么是 REST 资源以及它们与资源名称和资源表示有何关系 我读了一些关于这个主题的文章 但它们太抽象了 让我比以前更加困惑 以下 URL 是资源吗 如果是 该资源的名称是什么以及它的表示形式是什么 URL 的 GET 响应应类似于 id
  • 限制 iPhone 应用程序对服务器的访问

    我正在构建一个客户端 服务器 iPhone 游戏 我希望阻止第三方客户端访问服务器 这有两个原因 首先 我的收入模式是出售客户并赠送服务 其次我想避免促进作弊的客户激增 我正在用 Rails 编写服务器的第一个版本 但我正在考虑在某个时候迁
  • Xamarin,使用 Xlabs 示例中的地理定位

    使用 Xamarin 共享项目 我尝试在我的共享项目中包含 Xlabs 示例中的地理位置功能 但在调用 dependencyService 时遇到问题 我有一个内容页面 其中有我的按钮 其中包含如下命令 Command new Comman
  • Chrome 驱动程序无法在 Azure Web 应用程序上运行

    我使用过 NetCore2 App 并尝试截取给定 URL 的屏幕截图 它在本地运行完美 但部署到 Azure 后在创建 Webdriver 时出现问题 at OpenQA Selenium DriverService ctor Strin
  • LNK1120:1 个未解析的外部和 LNK2019:未解析的外部符号

    我遇到了这两个错误 但似乎找不到有效的解决方案 LNK1120 1 个未解析的外部 错误1错误LNK2019 无法解析的外部符号 public thiscall Vector3D Vector3D class Vector3D const
  • 如何在空手道中将驱动程序上下文从 Android 切换到 webview

    我正在开发一个使用空手道和 appium 自动化移动应用程序的项目 我正在开发的应用程序似乎是一个混合应用程序 当我启动应用程序时 它会将我重定向到要登录的 Web URL Web 浏览器 并且我的空手道测试无法找到登录页面下存在的元素 F
  • StreamGroup.merge 仅重新调整一个流

    我显然误解了如何StreamGroup merge工作原理或流如何工作或两者兼而有之 我有两个流正在查询 firestore 中的同一字段 我正在使用合并来创建一个名为mergedStream 这在 StreamBuilder 中用于为应用