首页 > 解决方案 > Flutter StreamSubscription cancel() 在无状态小部件中未取消

问题描述

我在无状态小部件中有这个 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);

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

标签: dartflutter

解决方案


Future cancel ()

取消此订阅。

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

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

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

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

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

返回的未来以空值完成。如果清理抛出(它确实不应该),则返回的未来会以该错误完成。


推荐阅读