我对如何正确地生成无限数据流以停止将蜂鸣添加到主题有疑问。像下面的例子一样:
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
永不返回而起作用。
答案 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);