Dart如何实现for循环延迟执行,10秒内从15倒数到5
Dart 逐秒倒数功能实现
问题原因
- 原有代码的for循环为同步执行逻辑,会一次性创建10个延迟1秒的Future任务,所有任务会在程序启动1秒后同时触发,无法形成逐秒间隔的效果
- 将
i--放入Future.delayed回调导致崩溃的核心原因是:for循环的终止条件判断为同步执行,异步回调中修改循环变量i会导致循环终止条件永远无法命中,触发死循环或变量越界问题。
推荐实现方案(async/await)
该写法逻辑简洁易读,通过await暂停for循环执行,每次等待1秒延迟完成后再进入下一轮循环,刚好10秒即可完成从15到5的倒数:
void main() async { var actualCurrent = 5; //Value from DB later var delayedCurrent = 15; // Value gets set in programm for (int i = delayedCurrent; i > actualCurrent; i--) { await Future.delayed(const Duration(seconds: 1)); print('value: $delayedCurrent'); delayedCurrent--; } }
可选实现方案(递归Future,无需async/await)
如果不方便使用async/await语法,可以通过递归调用的方式实现,每次回调执行完成后再生成下一个延迟任务:
void main() { var actualCurrent = 5; var delayedCurrent = 15; void countdown() { if (delayedCurrent <= actualCurrent) return; Future.delayed(const Duration(seconds: 1), () { print('value: $delayedCurrent'); delayedCurrent--; countdown(); }); } countdown(); }
内容的提问来源于stack exchange,提问作者Stas
相关产品推荐
相关产品推荐

