如何取消颤振/飞镖集团中的“等待”
Posted
技术标签:
【中文标题】如何取消颤振/飞镖集团中的“等待”【英文标题】:How can I cancel a 'await for' in a flutter / dart bloc 【发布时间】:2020-11-05 14:58:39 【问题描述】:我正在使用流来读取一个块中的位置数据。我有一个开始和一个停止事件。在 stop 方法中,我取消了流订阅。当我使用listen
到yield
的流时,yield
语句所在的状态永远不会被调用。
Stream<LocationState> _start() async*
_locationSubscription = location.onLocationChanged.listen(
(location) async*
if (location.isNotNull)
yield LocationState.sendData(location: updateLocation(location));
,
);
//send one initial update to change state
yield LocationState.sendData(
location: updateLocation(await Location().getLocation()));
Stream<LocationState> _stop() async
await _locationSubscription?.cancel();
_locationSubscription = null;
yield LocationState.stoped();
当我将 listen
替换为 await for
时,我看不到任何方法
阻止它产生事件,因为订阅句柄已经消失。
有任何想法吗?有什么解释吗?
Stream<LocationState> _start() async*
await for (LocationData location in location.onLocationChanged)
if (location.isNotNull)
yield LocationState.sendData(location: updateLocation(location));
//send one initial update to change state
yield LocationState.sendData(
location: updateLocation(await Location().getLocation()));
【问题讨论】:
我觉得这里的问题很难理解?你想阻止什么流?此外,您的第一个示例并没有按照您的预期进行。提供的方法正在调用 yield,然后返回值。但是这个方法被定义为void onDate(T event)
,所以它会把数据从LocationState.sendData
扔掉。此外,async*
方法是惰性求值的,当有人监听返回的Stream<T>
时,它将首先开始执行。在您的情况下,这永远不会发生,因为该方法被提供给listen
,它不会监听返回的Stream
。
对于你的第二个例子,我不确定问题是什么。从_start()
返回的Stream
必须在_start()
中的代码开始执行之前被监听。当您收听此Stream
时,您将获得一个StreamSubscription
,您可以取消它,这将停止_start()
中的代码运行。
在第二个例子中 - 如果停止事件被调用,我想取消启动方法中的流设置。没有我可以取消的流订阅。所以问题是如何停止'等待' 第一个例子 - 是的,你是对的,它不起作用。你有解决办法吗?
这个停止事件是从哪里来的(你的第二个例子不包含任何痕迹)?此外,如果您没有给出完整的工作示例,则很难给出任何建议。
ok 添加了停止方法。
【参考方案1】:
问题是我没有完全理解 yield 的行为。 另外,dart 框架也有一些不足。
这里与飞镖制造商详细讨论了这个问题。
https://github.com/dart-lang/sdk/issues/42717
这里
https://github.com/felangel/bloc/issues/1472
【讨论】:
以上是关于如何取消颤振/飞镖集团中的“等待”的主要内容,如果未能解决你的问题,请参考以下文章
如何根据 dateTIme 和 TimeOfDay 对颤振/飞镖中的列表项进行排序?