我知道当我不想再收到任何活动时,我必须取消Stream次订阅.

传递给另一个流的addStream个流会发生什么情况?它们是自动取消的吗?

同样的问题在StreamSink侧,如果流已经完成,我是否必须关闭它们?

推荐答案

简而言之:no, but you should.在StreamSubscription溪流汇 requires关闭资源的合同中没有任何内容,但是如果您不关闭它们,一些用例可能会导致内存泄漏,即使在某些情况下,这样做可能会令人困惑.围绕这些类的念力的一部分是它们是重载的,并且处理两个截然不同的用例:

  1. 资源流(如文件I/O、网络访问)
  2. 事件流(如点击处理程序)

让我们用撞击逐一关注这些话题,首先,StreamSubscription:

StreamSubscription

当你listen分到Stream分时,你会得到StreamSubscription分.通常,当您正在收听Stream时,无论出于什么原因,您都应该关闭订阅.如果 Select 不关闭,并不是所有的流都会泄漏内存,但是有些会泄漏-例如,如果您正在从文件读取输入,则不关闭流意味着文件的句柄可能保持打开状态.

所以,虽然不是strictly required,但当访问完流时,我会always cancel.

溪流汇

溪流汇最常见的实现是StreamController,它是创建Stream的编程接口.通常,当您的流是complete(即发出的所有数据)时,您应该关闭控制器.

这就是它变得有点令人困惑的地方.我们来看看这两个 case :

文件I/O

假设您正在创建一个API来逐行异步读取File:

Stream<String> readLines(String path);

要实现这一点,您可以使用StreamController:

Stream<String> readLines(String path) {
  SomeFileResource someResource;
  StreamController<String> controller;
  controller = new StreamController<String>(
    onListen: () {
      someResource = new SomeFileResource(path);
      // TODO: Implement adding to the controller.
    },
  );
  return controller.stream;
}

在这种情况下,当最后一行被读取时,closecontroller会很有意义.这会向用户发出文件已被读取并且有意义的信号(done事件)(例如,您可以在此时关闭File资源).

活动

假设您正在创建一个API来收听HackerNews上的新闻文章:

Stream<String> readHackerNews();

在这里,它对于底层接收器/控制器close来说意义不大.黑客新闻有stop次吗?像这样的事件流(或UI程序中的click个处理程序)在没有用户访问的情况下传统上不会"停止"(即取消StreamSubscription).

完成后could关闭控制器,但这不是必需的.


希望这是有意义的,并帮助您解决问题!

Dart相关问答推荐

如何在 Dart 中返回函数?

如何通过点击 BottomNavigationBarItem 以编程方式打开Drawer抽屉?

跳过 JavaScript 直接进入 Dart

dart 中 call() 的实现是什么?

Flutter:如何同步使用 SharedPreferences?

在 Flutter 中保持响应的同时制作持久的背景图像

如何在 Flutter 的小部件树中将新的 MaterialPageRoute 作为子项打开

Package:flutter/src/widgets/overlay.dart':Failed assertion: line 133 pos 12: "_overlay != null"

dart- 四舍五入

无法导入 dart 的 intl 包

Flutter url_launcher 未在发布模式下启动 url

Dart-对base64字符串进行编码和解码

如何更改Flatter DevTools的默认浏览器?

如何为 macos 桌面应用启用 Flutter 上网权限?

dart的Completer和Future?

可选参数的默认值

如何使用 Dart 和 web 以 60fps 的速度驱动动画循环?

Dart 如何匹配然后替换正则表达式

在 Dart 中获取集合/列表中数字总和的最简洁方法是什么?

如何在 Dart 中获取时间戳?