我想听一个视频流,但是我不想听以前的事件,只想听即将发生的事件
在检查了流的长度之后,我尝试使用skip,但是不知何故
final skipCount =await CartBloc().state.length;
listenForSuccess = CartBloc().state.skip(skipCount).listen((var state) {
//Do Something
listenForSuccess.cancel();
}
//CartBloc is a singleton so am not creating a new instance by calling //CartBloc()
答案 0 :(得分:1)
如果仅侦听流中的某些事件有意义,那么该流应为broadcast stream。
收听广播流将仅 提供您在收听后发送的新事件。它应该像您想要的那样工作。
就是说:只要听着,您不需要做任何其他事情就可以跳过以前的事件,它们已经发送出去了,并且它们不在等待您。
收听单订阅流将为您提供所有事件,这通常是必要的,因为:
您是唯一一个正在收听该视频流的人,并且
事件通常表示一个数据实体,该数据实体在异步读取时刚刚被分块。
如果您的信息流既不起作用,又是一个奇怪的信息流(并非没有可能,但并非仅使用dart:async
库就可以创建的东西)。
单订阅流的asBroadcast
流可能会缓冲事件,直到第一次侦听,然后开始像广播流一样工作。那可能就是您在这里处理的。在这种情况下,请尝试将代码更改为适当的广播流。
无论如何,您在此尝试的操作不适用于任何传统流。
在任何流上执行.length
将等待整个流完成。此后将不会再有其他事件发生,如果不是关闭的流,您将永远等待。
在广播流上,这不会阻止任何其他代码在同一流上侦听,但是await
将确保在流完成之前不会发生以下代码。
在单订阅流上,调用.length
之后,没有其他代码可以侦听相同的流,因此,如果到达以下代码,则将引发以下代码。
因此,如果流是广播流,那么您无需执行任何操作。由于看不到CardBloc
的代码,因此无法说出它的真正含义。假设它是一个单订阅流。然后应更改CardBloc
中的代码以使用StreamController.broadcast()
控制器创建流。您无法使用async*
方法创建广播流。或者,您可以通过执行以下操作将任何流转换为创建广播流:
var broadcastStream = stream.asBroadcastStream()..listen(null).cancel();
对返回的流进行一次侦听可确保它立即开始产生事件,而不是等到您第一次收听时才开始生成事件。