我正在使用流来读取集团中的位置数据。我有一个开始和停止事件。在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()));
}
答案 0 :(得分:2)
问题是我没有完全理解yield的行为。 另外,dart 框架也存在一些不足。
已在此处与飞镖制造商详细讨论了该问题。
https://github.com/dart-lang/sdk/issues/42717
这里