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

时间:2019-12-17 19:30:44

标签: 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永不返回而起作用。

1 个答案:

答案 0 :(得分:0)

请勿使用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();

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

如果其他内容告诉您何时停止,例如用户单击其他位置的按钮,则您要么需要使订阅保持可访问状态,以便稍后可以从已知代码中调用cancel是时候该停止了,或者在取消主题时停止:

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