【问题标题】:How can I cancel a 'await for' in a flutter / dart bloc如何取消颤振/飞镖集团中的“等待”
【发布时间】:2020-11-05 14:58:39
【问题描述】:

我正在使用流来读取一个块中的位置数据。我有一个开始和一个停止事件。在 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()));
  }

【问题讨论】:

  • 我觉得这里的问题很难理解?你想阻止什么流?此外,您的第一个示例并没有按照您的预期进行。提供的方法正在调用 yield,然后返回值。但是这个方法被定义为void onDate(T event),所以它会把数据从LocationState.sendData扔掉。此外,async* 方法是惰性求值的,当有人监听返回的Stream&lt;T&gt; 时,它将首先开始执行。在您的情况下,这永远不会发生,因为该方法被提供给listen,它不会监听返回的Stream
  • 对于你的第二个例子,我不确定问题是什么。从_start() 返回的Stream 必须在_start() 中的代码开始执行之前被监听。当您收听此Stream 时,您将获得一个StreamSubscription,您可以取消它,这将停止_start() 中的代码运行。
  • 在第二个例子中 - 如果停止事件被调用,我想取消启动方法中的流设置。没有我可以取消的流订阅。所以问题是如何停止'等待' 第一个例子 - 是的,你是对的,它不起作用。你有解决办法吗?
  • 这个停止事件是从哪里来的(你的第二个例子不包含任何痕迹)?此外,如果您没有给出完整的工作示例,则很难给出任何建议。
  • ok 添加了停止方法。

标签: flutter asynchronous dart


【解决方案1】:

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

这里与飞镖制造商详细讨论了这个问题。

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

这里

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

【讨论】:

    猜你喜欢
    • 2019-05-07
    • 2021-03-11
    • 1970-01-01
    • 2021-03-06
    • 1970-01-01
    • 2021-01-02
    • 2020-08-12
    • 2020-11-28
    • 2020-12-25
    相关资源
    最近更新 更多