美文网首页Flutter
Flutter倒计时定时器--重新获取验证码

Flutter倒计时定时器--重新获取验证码

作者: 锐心凌志 | 来源:发表于2019-08-01 20:03 被阅读0次

写一个倒计时定时器听起来真的好简单,然而在Flutter里面写这个东西还是挺坑的。
原本以为创建一个Timer就一切都搞定了,但并没办法实时获取倒计时的进度。

void countdown(){
    Timer timer = new Timer(new Duration(seconds: 10), () {
        // 只在倒计时结束时回调
    });
}
    看了一下源码,我们还可以创建一个周期性的Timer,从打印结果可以看到Timer的tick是从1开始的。
void countdown(){
    Timer countdownTimer =  new Timer.periodic(new Duration(seconds: 1), (timer) {
        print(countdownTimer.tick);
    }
}
    我们修改一下做一个倒计时获取重新获取验证码的功能。
  Timer _countdownTimer;
  String _codeCountdownStr = '获取验证码';
  int _countdownNum = 59;

  void reGetCountdown() {
    setState(() {
      if (_countdownTimer != null) {
          return;
      }
      // Timer的第一秒倒计时是有一点延迟的,为了立刻显示效果可以添加下一行。
      _codeCountdownStr = '${_countdownNum--}重新获取';
      _countdownTimer =
          new Timer.periodic(new Duration(seconds: 1), (timer) {
        setState(() {
          if (_countdownNum > 0) {
            _codeCountdownStr = '${_countdownNum--}重新获取';
          } else {
            _codeCountdownStr = '获取验证码';
            _countdownNum = 59;
            _countdownTimer.cancel();
            _countdownTimer = null;
          }
        });
      });
    });
  }

 // 不要忘记在这里释放掉Timer
 @override
  void dispose() {
    _countdownTimer?.cancel();
    _countdownTimer = null;
    super.dispose();
  }

完整代码:

typedef VoidCallback = void Function();

class CountDownWidget extends StatefulWidget {
   final VoidCallback onPressed;
    int time;
    TextStyle startStyle;
    TextStyle downStyle;
    String startText;
    String downText;

    CountDownWidget({int time,TextStyle startStyle,TextStyle downStyle,String startText,String downText,this.onPressed}): this.time = time,this.startStyle = startStyle,this.downStyle = downStyle,this.startText = startText,this.downText = downText ;

  @override
  State<StatefulWidget> createState() {
    // TODO: implement createState
    return FollowleState(this.time,this.startStyle,this.downStyle,this.startText,this.downText);
  }

}

class FollowleState extends State<CountDownWidget>{
  int time;
  int custime;
  TextStyle startStyle;
  TextStyle downStyle;
  TextStyle style;
  Timer _countdownTimer;
  String startText;
  String downText;
  String _codeCountdownStr;

  FollowleState(int time,TextStyle startStyle,TextStyle downStyle, String startText,String downText){
    this.time = time;
    this.custime = time;
    this.custime = time;
    this.startStyle = startStyle;
    this.downStyle = downStyle;
    this.style = startStyle;
    this.startText = startText;
    this.downText = downText;
  }


  void reGetCountdown() {
    setState(() {
      if (_countdownTimer != null) {
        return;
      }
      style = downStyle;
      _codeCountdownStr = startText;
      // Timer的第一秒倒计时是有一点延迟的,为了立刻显示效果可以添加下一行。
      _codeCountdownStr = '$downText(${time--}s)';
      _countdownTimer =
      new Timer.periodic(new Duration(seconds: 1), (timer) {
        setState(() {
          if (time > 0) {
            style = downStyle;
            _codeCountdownStr = '$downText(${time--}s)';
          } else {
            style = startStyle;
            _codeCountdownStr = startText;
            time = custime;
            _countdownTimer.cancel();
            _countdownTimer = null;
          }
        });
      });
    });
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();

  }

  @override
  void initState() {
    // TODO: implement initState
    _countdownTimer?.cancel();
    _countdownTimer = null;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {

    return Center(
        child: GestureDetector(
          child: Text(_codeCountdownStr,style: style,),
          onTap: (){
            this.widget.onPressed();
            reGetCountdown();
          },
        ),
    );

  }

}

相关文章

  • iOS 倒计时效果的实现

    // 添加定时器 // 倒计时操作 // 定时器的销毁 点击按钮获取验证码 注意:如果获取验证码的按钮是通过sb ...

  • Flutter倒计时定时器--重新获取验证码

    写一个倒计时定时器听起来真的好简单,然而在Flutter里面写这个东西还是挺坑的。原本以为创建一个Timer就一切...

  • iOS倒计时

    pragma mark ---获取验证码 /**获取验证码,倒计时@param sender 获取验证码的按...

  • 获取验证码按钮的状态

    有四个状态 获取验证码 发送中 倒计时 60-1 重新获取 1.默认为获取验证码首先 点击发送请求 中 按钮为 发...

  • iOS-CJJTimer 高性能倒计时工具(短信、商品秒杀)

    在平时开发中,多多少少都会用到定时器,获取短信验证码、商品秒杀倒计时等等,如果每次都去写一堆定时器代码不仅麻烦而且...

  • RAC | RactiveCocoa/ReactiveObjC

    实现一个简单的验证码获取倒计时的功能 UIButton 私有变量 按钮事件监听和处理 开启定时器 设置按钮titl...

  • 三种方法使用jquery获取验证码倒计时

    三种方法使用jquery获取验证码倒计时,并设置防重复点击 获取验证码1 获取验证码2 获取验证码3 /...

  • 【微信小程序】获取验证码60s倒计时

    验证码倒计时,手机号格式校验。 【简要说明】code字段在获取验证码之前显示验证码,点击获取验证码后显示倒计时数字...

  • IOS倒计时按钮实现思路及Demo

    前言 最近因为项目中涉及到短信获取验证码功能,并且获取验证码按钮需要显示倒计时功能,同时当从获取验证码界面在倒计时...

  • OC中的定时器

    在开发中,有时候,我们会用到定时器,像获取验证码倒计时,语音播放倒计时,又或者循环展示某一个广告之类的等等,都会用...

网友评论

    本文标题:Flutter倒计时定时器--重新获取验证码

    本文链接:https://www.haomeiwen.com/subject/etthdctx.html