大家开发时一定都做过验证码倒计时的功能,在原生开发时,iOS后台时定时器也有不走的问题,这是因为iOS是假后台,在iOS原生情况下,我们一般采用启动后台任务的方法防止,定时器不走的问题。
但是在Flutter上我们如何做呢?
Timer
有个属性:tick
即使 callback 停止回调,Timer.periodic方式初始化的Timer,每次到时间,tick 也是在一直在累加的,利用这个 tick,我们只需要通过tick就能够知道当前还剩多少时间,比如做验证码倒计时60s:
/// 剩余时间,当_remainCount等于0时,显示重新获取
int _remainCount = 60;
_timer = Timer.periodic(const Duration(seconds: 1), (timer) {
if (timer.tick >= 60) {
timer.cancel();
}
setState(() {
_remainCount = 60 - timer.tick >= 0 ? 60 - timer.tick : 0;
});
});
同理,如果我们做3分钟的倒计时后执行某个任务可以这样写,注意必须是timer.tick >= 3,因为从后台回来的时候可能大于3分钟了
/// 启动3分钟定时
_startMaxTimer() {
_maxTimer = Timer.periodic(const Duration(minutes: 1), (timer) async {
if (timer.tick >= 3) {
timer.cancel();
/// 执行某些操作
}
});
}