flutter - 关闭接收无限数据流的主题的最佳方法是什么?

标签 flutter dart rxdart

我有一个关于如何正确制作无限数据流以停止添加到主题的问题。就像下面的例子:

void main() async {
  var infinite = Stream.periodic(0.5.seconds, (it) => it);

  var subject = BehaviorSubject<int>();
  subject.addStream(infinite);

  subject.listen(print);
  await Future.delayed(Duration(milliseconds: 1000));
  await subject.close(); //It will not allow me to close the subject
}

infite 是一个无限的数据源。它永远不会发出 close 事件。那么,如何正确关闭 subject,因为它永远不会完成接收数据?

编辑:在 Bad state: You cannot close the subject while items are being added from addStream in flutter 上提出的解决方案不工作仅仅是因为 drain 永远不会返回。

最佳答案

不要使用addStream

您需要一种方法来停止接收事件,而 addStream 方法不提供任何方法在流完成之前停止,这是永远不会的。

如果您提前知道您想要多少个元素,您可以执行 subject.addStream(infinite.take(1000)) 以仅获取前 1000 个事件.

如果不是,也许就像您的示例一样,您以时间为基础,那么我会采用类似的方法:

var subscription = infinite.listen(subject.add);
subject.listen(print);
await Future.delayed(Duration(milliseconds: 100));
await subscription.cancel();
subject.close();

Stream.listen 返回的StreamSubscription 为您提供了一种停止 再次收听的方法。或者暂停并稍后恢复事件,如果这就是您所需要的。

如果其他东西告诉您何时停止,例如用户在其他地方单击按钮,您要么需要保持订阅可访问,以便您可以在稍后的时间点调用 cancel知道是时候停止的代码,或者在主题被取消时这样做:

var subscription = infinite.listen(subject.add);
subject.onCancel = subscription.cancel;
subject.listen(print);

关于flutter - 关闭接收无限数据流的主题的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59380906/

相关文章:

flutter - 如何用列中的空值解决问题?

android - Flutter 自动与设备发送短信

amazon-web-services - 无法从亚马逊复制简单的哈希签名示例

split - 比较Dart中从左到右,从右到左的字符串

flutter - 如何在 Dart 中将 RxInt 转换为 Int || flutter ?

dart - Flutter Streams,如何从流中访问之前发出的数据

ios - Flutter iOS 运行错误 : Could not parse callback cache, 中止恢复

android - 将 firebase 消息传递添加到 flutter android 项目时出现依赖错误

json - 如何使用 flutter 中的 googleapis 创建 Json 文件并将其保存到 Google Drive

dart - dart 中的 throttle 函数执行