倒计时

作者: 寒云暮雨 | 来源:发表于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 ,这个用于绘制倒计时。

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

相关文章

  • 倒计时

    新年倒计时…中考倒计时…高考倒计时…告别学生倒计时…假期倒计时…睡觉倒计时…起床倒计时… 生活中,很多与我们息息相...

  • 倒计时不仅使我们焦躁,还可以使我们振奋啊

    中考倒计时,高考倒计时, 倒计时100天 倒计时50天 倒计时10天 倒计时5天 ........ 这个场景想必在...

  • 倒计时

    文/木子 开学倒计时了 爸妈回去倒计时了 教师节倒计时了 国庆节倒计时了 小儿12岁倒计时了 寒假倒计时了 元旦倒...

  • wordlist 13

    倒计时倒计时

  • wordlist 11

    倒计时倒计时

  • van-count-down 倒计时相关问题

    1. 倒计时重置问题 背景:业务需要在开启倒计时、暂停、恢复倒计时实时判断是否展示倒计时,并重置倒计时 问题:直接...

  • iOS开发-倒计时

    倒计时 倒计时60s 倒计时HH-MM-SS 1.倒计时60s 很多时候在点击按钮发送短信的时候需要倒计时读秒 2...

  • 10.27

    倒计时第一天,倒计时7,好想赶快到倒计时1。

  • 1小时倒计时

    倒计时 目前我们内部用的比较多的倒计时:一个小时的倒计时、12个小时的倒计时。 examinePassTime:审...

  • js中date倒计时

    获取倒计时之前,我们不妨先来看怎样获取当前时间吧!!! 获取倒计时 1、实现倒计时功能2、倒计时结束按钮可被点击,...

网友评论

    本文标题:倒计时

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