我有一个关于如何正确制作无限数据流以停止添加到主题的问题。就像下面的例子:
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/