dart - 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);
一分钟后,订阅取消被打印,但地理定位器不断被调用。
解决方案
Future cancel ()
取消此订阅。
在此调用之后,订阅不再接收事件。
订阅取消后,流可能需要关闭事件源并进行清理。
返回流完成清理后完成的未来。
由于历史原因,如果不需要清理,也可能返回 null。返回 null 已被弃用,应该避免。
通常,当流需要释放资源时,会返回期货。例如,流可能需要关闭打开的文件(作为异步操作)。如果侦听器想在取消订阅后删除文件,它必须等待清理未来完成。
返回的未来以空值完成。如果清理抛出(它确实不应该),则返回的未来会以该错误完成。
推荐阅读
- jql - 显示有新评论的任务的 JQL 查询
- python-3.x - Python - 如何将字符串添加到列表项并返回修改后的列表项
- cuda - 如何解释 ptx 函数名
- time-complexity - 如何正式计算朴素多项式评估在某一点的运行时间
- git - git revert 未触发 Commit-msg 钩子
- c - 数组初始化中数组元素的赋值
- java - 如何单独格式化双值逗号
- javascript - 未捕获的引用错误:未定义 Excel
- java - Raspberry Pi 上 JavaFX 中的 TouchPoint 有时会将坐标默认为零
- reactjs - 如果条件不工作在reactjs中除外,如何处理另一个条件