Flutter使用Duration实现倒计时器无法自动计时问题求助
你的代码核心问题有两个:
Duration是值类型,你传入countDownTimer的是nextTime的初始值副本,回调函数内部的duration不会随着外部变量变化自动更新- 定时器回调里只做了超时判断,没有实现每秒扣除1秒时长、同步更新状态变量的逻辑,所以倒计时不会自动走
修正方案
- 调整倒计时函数逻辑,直接操作类的成员变量,每秒更新状态:
Timer? timer; Duration? nextTime; // 确保是你的类成员变量 void countDownTimer() { const oneSec = Duration(seconds: 1); // 先清空之前可能存在的定时器,避免重复创建 timer?.cancel(); timer = Timer.periodic( oneSec, (Timer timer) => setState(() { if (nextTime?.inSeconds == 0) { timer.cancel(); // 这里可以添加倒计时结束后的触发逻辑 } else { nextTime = nextTime! - oneSec; // 页面组件直接绑定nextTime即可自动刷新显示 } }), ); }
- 修改
initState里的调用逻辑:
@override void initState() { super.initState(); AndroidAlarmManager.initialize(); getOffsetSign(); nextTime = nextAlarmTime(); print("From inside init state: $nextTime"); countDownTimer(); }
- 页面销毁时释放定时器避免内存泄漏:
@override void dispose() { timer?.cancel(); super.dispose(); }
内容的提问来源于stack exchange,提问作者user14709104
相关产品推荐
相关产品推荐

