【发布时间】: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 添加了停止方法。
标签: flutter asynchronous dart