我如何在扑扑/飞镖集团中取消“等待”

时间:2020-07-16 01:57:07

标签: flutter asynchronous dart

我正在使用流来读取集团中的位置数据。我有一个开始和停止事件。在stop方法中,我取消了流订阅。当我使用listenyield的流时,永远不会调用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()));
  }

1 个答案:

答案 0 :(得分:2)

问题是我没有完全理解yield的行为。 另外,dart 框架也存在一些不足。

已在此处与飞镖制造商详细讨论了该问题。

https://github.com/dart-lang/sdk/issues/42717

这里

https://github.com/felangel/bloc/issues/1472