倒计时

作者: 寒云暮雨 | 来源:发表于2018-10-29 10:47 被阅读48次

    最近一直不知道在忙什么,或许忙着思考人生吧!明确一下人生方向,纠结了好久,始终没有明白以后往哪走。打算放一下对人生的思考,写点文章,总结一下最近的学习(╹▽╹),现在回过头来看这个做法有点二,async包里面的Timer更好用。
    [图片上传中...(image.png-37d86d-1540784030421-0)]

    import 'package:flutter/material.dart';
    
    typedef void StopCount(bool b);
    typedef void StartCountAction(BuildContext context);
    
    class TimerWidget extends StatefulWidget {
      final int time;
      final StartCountAction startCountAction;
    
      TimerWidget({this.time = 10, this.startCountAction});
    
      @override
      State createState() {
        return new _TimerWidgetState();
      }
    }
    
    class _TimerWidgetState extends State<TimerWidget> {
      bool isPressed = false;
      Widget timer;
    
      void _startCount(bool b) {
        setState(() {
          isPressed = b;
        });
      }
    
      void _stopCount(bool b) {
        setState(() {
          isPressed = !b;
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return new GestureDetector(
          onTap: () {
            if (isPressed) {
              return;
            }
            timer = new TimerCount(
              time: 10,
              stopCount: _stopCount,
            );
            widget.startCountAction(context);
            _startCount(true);
          },
          child: isPressed ? timer : new Text('点击获得验证码'),
        );
      }
    }
    
    class TimerCount extends StatefulWidget {
      final int time;
      final StopCount stopCount;
      final String leftLabel;
      final String rightLabel;
    
      TimerCount(
          {this.time = 60,
          this.stopCount,
          this.leftLabel = '还有',
          this.rightLabel = '秒重发'});
    
      @override
      State createState() {
        return new _TimerCountState();
      }
    }
    
    class _TimerCountState extends State<TimerCount> {
      int _time;
      bool isPressed = false;
    
      @override
      void initState() {
        super.initState();
        setState(() {
          _time = widget.time;
        });
        _triggerStart();
      }
    
      void _count() {
        Future.delayed(const Duration(seconds: 1), _triggerStart);
      }
    
      void _triggerStart() {
        if (_time <= 0) {
          widget.stopCount(true);
          return;
        }
        _count();
        setState(() {
          _time -= 1;
          print(_time);
        });
      }
    
      @override
      Widget build(BuildContext context) {
        return new Container(
          child: new Text(widget.leftLabel + '$_time' + widget.rightLabel),
        );
      }
    }
    
    

    第一步,分析需求。点击倒计时的时候,控件上显示倒计时提示,显示倒计时时间,同时倒计时开始时可以进行一定回调。
    第二步,确定应用场景。用于发送验证码。
    第三部,预测bug。出现重复点击,重复显示倒计时或者读秒显示混乱。
    第四部,确定整体思路。首先flutter框架里面的控件widget是分为有状态的(StatefulWidget )和无状态的(StatelessWidget),对于有状态的weidget是通过state管理,通过更新状态来更新ui。所以,我们可以用有状态的widget防止重复点击,通过更新状态来读秒,通过定义回调函数来,最终让控件可以实现发送验证码的功能。
    首先顶定义一个TimerWidget ,这个控件用于控件有两个属性,time用户设置控件倒计时时长;StartCountAction 用户倒计时开始的回调,可以用于发送验证码。再定义一个TimerCount ,这个用于绘制倒计时。

    文笔不好,还望见谅!
    直接上代码
    最后要感谢这些小伙伴们的无私分享:

    相关文章

      网友评论

        本文标题:倒计时

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