Dart 只收听即将到来的活动
我想听一个流,但我不想听以前的事件,只想听即将到来的事件 在检查流长度后,我尝试使用skip,但不知怎的,它不起作用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
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我想这是一个值得观察的例子