如需转载,请注明出处:Flutter学习笔记(40)--Timer实现短信验证码获取60s倒计时
先看下效果:

两种需求场景:
1.广告页3s后跳转到首页
2.短信验证码60s倒计时
第一种的话,根据需求我们可以知道,我们想要的效果就是3s结束做出一个动作。
1factory Timer(Duration duration, void callback()) { 2 if (Zone.current == Zone.root) { 3 // No need to bind the callback. We know that the root's timer will 4 // be invoked in the root zone. 5 return Zone.current.createTimer(duration, callback); 6 } 7 return Zone.current 8 .createTimer(duration, Zone.current.bindCallbackGuarded(callback)); 9 }
两个参数,第一个参数超时时间,即多久后执行你想要的动作,第二个参数callback回调方法,即超时后你想要执行的动作是什么,比如跳转到首页。
第二种的话就是需要不断的做出倒计时的动作。
1factory Timer.periodic(Duration duration, void callback(Timer timer)) { 2 if (Zone.current == Zone.root) { 3 // No need to bind the callback. We know that the root's timer will 4 // be invoked in the root zone. 5 return Zone.current.createPeriodicTimer(duration, callback); 6 } 7 var boundCallback = Zone.current.bindUnaryCallbackGuarded<Timer>(callback); 8 return Zone.current.createPeriodicTimer(duration, boundCallback); 9 }
这种调用方式和上面的方式的区别是:第一种只会回调一次,就是超时时间到了之后执行callback回调方法,而Timer.periodic调用方式是循环不断的调用,比如说通过这种方式,你设置的超时时间是1s的话,那就会每隔1s调用一次callback的回调方法,也就是通过这种方式来实现我们的短信验证码60s倒计时获取。
看下具体用法吧:
1 Timer _timer; 2 int _timeCount = 60;
触发事件:
1onTap: () { 2 _startTimer(); 3},
处理方法:
1void _startTimer() { 2 ToastUtil.showTips('短信验证码已发送,请注意查收'); 3 _timer = Timer.periodic(Duration(seconds: 1), (Timer timer) => { 4 setState(() { 5 if(_timeCount <= 0){ 6 _autoCodeText = '重新获取'; 7 _timer.cancel(); 8 _timeCount = 60; 9 }else { 10 _timeCount -= 1; 11 _autoCodeText = "$_timeCount" + 's'; 12 } 13 }) 14 }); 15 }