Dart 只收听即将到来的活动

Dart 只收听即将到来的活动,dart,stream,Dart,Stream,我想听一个流,但我不想听以前的事件,只想听即将到来的事件 在检查流长度后,我尝试使用skip,但不知怎的,它不起作用 final skipCount =await CartBloc().state.length; listenForSuccess = CartBloc().state.skip(skipCount).listen((var state) { //Do Something listenForSuccess.cancel(); } //CartBloc is a singl

我想听一个流,但我不想听以前的事件,只想听即将到来的事件

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

如果只侦听流的某些事件是有意义的,那么该流应该是一个

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

也就是说:听好了,你不需要做任何额外的事情来跳过之前的事件,它们已经被发送出去了,它们不会等你

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

  • 你是唯一一个听那条小溪的人,而且

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

  • 如果您的流不是这两个流中的任何一个,那么它就是一个奇怪的流(不是不可能的,但不是仅使用
    dart:async
    库就可以创建的)

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

    无论如何,您在这里尝试的内容对任何传统流都不起作用

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

    因此,如果该流是广播流,则无需执行任何操作。因为我看不到
    CardBloc
    的代码,所以我说不出它到底是什么。让我们假设它是一个单一的订阅流。然后应更改
    CardBloc
    中的代码,以使用
    StreamController.broadcast()
    控制器创建流。不能使用
    async*
    方法创建广播流。或者,您可以通过执行以下操作从任何流转换为创建广播流:

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

    侦听一次返回的流可确保它立即开始生成事件,不要等到你第一次听它,如果你想要的话。

    我想我需要的是广播流,但是你能不能在一个片段中给我一个方法,让我可以使用与广播流相同的流。非常感谢你,但我似乎无法使它工作。我正在使用bloc包来处理CartBloc和状态变量holds我想这是一个值得观察的例子