我正在使用流读取块中的位置数据。我有一个开始和一个停止事件。在 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的行为。
此外,dart 框架也有一些缺点。
与 Dart 制造商详细讨论了这个问题,这里。
https://github.com/dart-lang/sdk/issues/42717
和这里
https://github.com/felangel/bloc/issues/1472
关于flutter - 如何在 flutter/Dart block 中取消 'await for',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62926257/