Flutter中递归调用Future.delayed实现间隔刷新是否会引发栈溢出
结论
你当前的写法不会导致栈溢出,但代码逻辑存在错误,无法实现你预期的「两次查询间隔30秒」的效果。
不会栈溢出的原因
Dart的异步执行基于事件循环模型,async/await语法的本质是将await之后的代码包装为异步回调,调度到事件队列中等待执行,不会产生同步递归的调用栈堆叠,因此不存在栈溢出风险。
现有代码的问题
你写的await Future.delayed(Duration(seconds: 30), onRefresh);存在两个逻辑缺陷:
- 30秒延迟结束后会直接触发
onRefresh执行,同时你又await了这个延迟Future的完成,相当于同时存在两条独立的onRefresh执行流,没有实现间隔等待的效果 - 没有停止机制,只要应用不退出,刷新逻辑会永远执行,无法手动控制启停
正确实现方案
你可以用死循环加await的方式实现需求,完全匹配你「上一次查询结束后间隔30秒再执行下一次」的要求:
// 定义一个控制启停的布尔变量,组件销毁/需要停止刷新时设为false即可 bool _isAutoRefreshActive = true; Future<void> runAutoRefresh() async { while (_isAutoRefreshActive) { // 执行你的耗时查询逻辑 await yourLongTimeQueryFunction(); // 查询完成后等待30秒再进入下一轮循环 await Future.delayed(const Duration(seconds: 30)); } }
内容的提问来源于stack exchange,提问作者s k
相关产品推荐
相关产品推荐

