【问题标题】:Flutter StreamSubscription cancel() not canceling in Stateless widgetFlutter StreamSubscription cancel() 在无状态小部件中未取消
【发布时间】:2019-02-07 15:43:09
【问题描述】:

我在无状态小部件中有这个 Streamsubscription

StreamSubscription < LocationResult > subscription = 
Geolocation.locationUpdates(
accuracy: LocationAccuracy.best,
displacementFilter: 30.0, // in meters
inBackground: true,)
.listen((result) {
if (result.isSuccessful) {         
saveResult(result);
} else {
}
});

我在计时器中调用它

startTimeout(mins) async {
await subscription.resume();
print("susbscription started");
return new Timer(Duration(minutes: mins), handleTimeout);
}
void handleTimeout() async{  // callback function
await subscription.cancel();
print("susbscription canceled");
}

在按钮点击时调用计时器:

startTimeout(1);

打印一分钟后取消订阅,但地理定位器不断被调用。

【问题讨论】:

  • 我不确定您所说的“地理定位器不断被调用”是什么意思。它是否不断生成事件,并且您是否不断接收它们?如果是这样,我猜你取消了错误的订阅 - 你不应该在取消后收到事件。如果您可以看到服务器不断收到请求,那么Geolocation 的取消处理可能存在错误,但这是不可能通过测试而不被捕获的。那么,您能否准确解释一下您所看到的以及您希望看到的内容?

标签: dart flutter


【解决方案1】:
Future cancel ()

取消此订阅。

此调用后,订阅不再接收事件。

流可能需要关闭事件源并清理 取消订阅后。

返回流完成后完成的未来 清理。

由于历史原因,如果没有清理,也可能返回 null 必要的。返回 null 已被弃用,应该避免。

通常,当流需要释放时,会返回期货 资源。例如,一个流可能需要关闭一个打开的文件(如 异步操作)。如果监听器想删除文件 取消订阅后,必须等待清理 未来完成。

返回的未来以空值完成。如果清理抛出, 它真的不应该,返回的未来完成 错误。

【讨论】:

  • 是的,我已经查过了,我在 timeOut 中执行了 cancel()。
猜你喜欢
  • 2021-08-27
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 2020-03-10
  • 2019-09-23
  • 2019-06-10
  • 1970-01-01
相关资源
最近更新 更多