仅听即将发生的事件

时间:2019-06-06 17:03:24

标签: dart stream

我想听一个视频流,但是我不想听以前的事件,只想听即将发生的事件

在检查了流的长度之后,我尝试使用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()

1 个答案:

答案 0 :(得分:1)

如果仅侦听流中的某些事件有意义,那么该流应为broadcast stream

收听广播流将仅 提供您在收听后发送的新事件。它应该像您想要的那样工作。

就是说:只要听着,您不需要做任何其他事情就可以跳过以前的事件,它们已经发送出去了,并且它们不在等待您。

收听单订阅流将为您提供所有事件,这通常是必要的,因为:

  1. 您是唯一一个正在收听该视频流的人,并且

  2. 事件通常表示一个数据实体,该数据实体在异步读取时刚刚被分块。

如果您的信息流既不起作用,又是一个奇怪的信息流(并非没有可能,但并非仅使用dart:async库就可以创建的东西)。

单订阅流的asBroadcast流可能会缓冲事件,直到第一次侦听,然后开始像广播流一样工作。那可能就是您在这里处理的。在这种情况下,请尝试将代码更改为适当的广播流。

无论如何,您在此尝试的操作不适用于任何传统流。

在任何流上执行.length等待整个流完成。此后将不会再有其他事件发生,如果不是关闭的流,您将永远等待。 在广播流上,这不会阻止任何其他代码在同一流上侦听,但是await将确保在流完成之前不会发生以下代码。 在单订阅流上,调用.length之后,没有其他代码可以侦听相同的流,因此,如果到达以下代码,则将引发以下代码。

因此,如果流是广播流,那么您无需执行任何操作。由于看不到CardBloc的代码,因此无法说出它的真正含义。假设它是一个单订阅流。然后应更改CardBloc中的代码以使用StreamController.broadcast()控制器创建流。您无法使用async*方法创建广播流。或者,您可以通过执行以下操作将任何流转换为创建广播流:

var broadcastStream = stream.asBroadcastStream()..listen(null).cancel();

对返回的流进行一次侦听可确保它立即开始产生事件,而不是等到您第一次收听时才开始生成事件。