如何取消颤振/飞镖集团中的“等待”

Posted

技术标签:

【中文标题】如何取消颤振/飞镖集团中的“等待”【英文标题】: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 添加了停止方法。 【参考方案1】:

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

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

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

这里

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

【讨论】:

以上是关于如何取消颤振/飞镖集团中的“等待”的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 dateTIme 和 TimeOfDay 对颤振/飞镖中的列表项进行排序?

如何在颤振/飞镖中捕获平台异常?

如何对实例类列表进行排序取决于其在飞镖或颤振中的属性[重复]

在你的颤振项目中找不到颤振 sdk 中的飞镖?

如何在飞镖/颤振中设置或删除地图标记

无法解析颤振/飞镖中的文件