热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Flutter135:图解Timer&ACETimerButton自定义计时器按钮

    小菜在学习Flutter过程中,可能会遇到倒计时等需求,此时需要用到Timer计时器,小菜简单尝试一下;

    小菜在学习 Flutter 过程中,可能会遇到倒计时等需求,此时需要用到 Timer 计时器,小菜简单尝试一下;

Timer

    Timer 作为一个抽象类,提供了两种工厂方法进行调用;可以作为一次或者重复触发的倒计时计时器;

案例尝试

1. Timer()

factory Timer(Duration duration, void Function() callback) { if (Zone.current == Zone.root) { return Zone.current.createTimer(duration, callback); } return Zone.current.createTimer(duration, Zone.current.bindCallbackGuarded(callback)); }

    Timer 允许指定延迟时间之后执行,通过设置 Timeout 来指定延迟时间,之后通过 callback 回调对执行结果进行监听处理;

Timer(Duration(seconds: 3), () { print("_timer01() -> Timer(Duration(seconds: 3) printed after 3 seconds"); Toast.show('Timer(Duration(seconds: 3) printed after 3 seconds !', context, duration: Toast.LENGTH_SHORT, gravity: Toast.BOTTOM); });

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮

2. Timer.periodic()

factory Timer.periodic(Duration duration, void callback(Timer timer)) { if (Zone.current == Zone.root) { return Zone.current.createPeriodicTimer(duration, callback); } var boundCallback = Zone.current.bindUnaryCallbackGuarded(callback); return Zone.current.createPeriodicTimer(duration, boundCallback); }

    简单了解 Timer.periodic() 命名构造方法可得,该命名构造方法通过定时绑定回调进行再次 Timer 倒计时处理;

    Timer.periodic() 可以重复性、周期性的进行倒计时,若不进行手动调用,则会一直关闭,即便页面关闭也会继续调用;

    其中 Timer.tick 为调用次数,Timer.isActive 代表当前 Timer 是否处于活跃状态;

Timer.periodic(Duration(seconds: 2), (timer) { print('_timer02() -> Timer.periodic() -> Timer.tick -> ${timer.tick} -> Timer.isActive -> ${timer.isActive}'); });

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮

3. Timer.run()

static void run(void Function() callback) { new Timer(Duration.zero, callback); }

    Timer 的执行为异步操作,Flutter 提供了便利的 Timer.run() 命名构造函数可以方便尽快执行,可以简单理解为倒计时为 0

    小菜尝试了如下操作顺序,首先执行同步的 A -> B -> C,之后才会是异步的 run() 和 Duration.zero

print('_timer03() -> A'); Timer.run(() { print('_timer03() -> Timer.run()'); }); print('_timer03() -> B'); Timer(Duration.zero, () { print('_timer03() -> Duration.zero'); }); print('_timer03() -> C');

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮

4. cancel()

    Timer() 计时器可以通过 cancel() 来取消,尤其是在进行周期性的 Timer.periodic() 调用时,需要在合适的时机及时取消;小菜尝试在 Timer() 回调内取消和方法外回调两种方式;

4.1 Timer() 回调内取消

Timer.periodic(Duration(seconds: 2), (timer) { if (timer.tick == 3) { timer.cancel(); } print('_timer04() -> Timer.periodic() -> Timer.tick -> ${timer.tick} -> Timer.isActive -> ${timer.isActive}'); });

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮
4.2 方法外取消

_timer = Timer.periodic(Duration(seconds: 2), (timer) { print('_timer05() -> Timer.periodic() -> Timer.tick -> ${timer.tick} -> Timer.isActive -> ${timer.isActive}'); }); _timer.cancel();

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮

ACETimerButton 自定义计时器

    小菜尝试了一个简单的计时器,类似于获取验证码按钮;timeout 为倒计时时长,color 用于自定义文本颜色,preName 为文本内容;

ACETimerButton(this.timeout, {this.color, this.preName});

    整个定义过程很简单,只需在按钮点击时更新按钮文本内容以及进行 Timer 周期性倒计时计算,并在倒计时结束和 Widget 销毁时及时取消并销毁 Timer 即可;

class ACETimerButton extends StatefulWidget { final int timeout; final Color color; final String preName; ACETimerButton(this.timeout, {this.color, this.preName}); @override _ACETimerButtonState createState() => _ACETimerButtonState(); } class _ACETimerButtonState extends State { Timer _timer; int _timeOut; String _name; bool _isClick = false; @override Widget build(BuildContext context) => GestureDetector( onTap: () { if (!_isClick) { _startTimer(); } _isClick = true; }, child: Container( padding: EdgeInsets.all(6.0), decoration: BoxDecoration( color: Colors.grey.withOpacity(0.2), borderRadius: BorderRadius.circular(4.0)), child: Center(child: Text(_name ?? 'click', style: TextStyle(color: widget.color ?? Colors.blue, fontSize: 16.0))))); @override void initState() { super.initState(); _name = widget.preName; _timeOut = widget.timeout; } _startTimer() { _timer = Timer.periodic(const Duration(seconds: 1), (timer) { setState(() { _timeOut--; _name = '$_timeOut s'; }); if (_timeOut == 0) { _cancelTimer(); _isClick = false; _name = widget.preName; _timeOut = widget.timeout; } }); } _cancelTimer() { if (_timer != null) { _timer.cancel(); _timer = null; } _isClick = false; } @override void dispose() { super.dispose(); _cancelTimer(); } }

Flutter 135: 图解 Timer & ACETimerButton 自定义计时器按钮

    Timer 案例源码


    小菜对 Timer 计时器的学习暂时告一段落,对于 ACETimerButton 自定义计时器按钮还不够完善;如有错误,请多多指导!

来源: 阿策小和尚


推荐阅读
  • 先上图引入插件在pubspec.yaml中引入charts_flutter插件使用的时候版本到0.6.0,插件地址:https:github.comgooglecharts使用插件 ... [详细]
  • 手把手教会你使用责任链模式
    什么是责任链模式顾名思义,责任链就是将多个处理单元串成链路,是一种行为模式。例如我们的登录校验(用户判断-账号密码判断-验证码校验- ... [详细]
  • 出色的对话框未在Flutter应用中关闭
    我在flutter应用程序中使用了Awesom ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文整理了Java面试中常见的问题及相关概念的解析,包括HashMap中为什么重写equals还要重写hashcode、map的分类和常见情况、final关键字的用法、Synchronized和lock的区别、volatile的介绍、Syncronized锁的作用、构造函数和构造函数重载的概念、方法覆盖和方法重载的区别、反射获取和设置对象私有字段的值的方法、通过反射创建对象的方式以及内部类的详解。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 前段时间做一个项目,需求是对每个视频添加预览图,这个问题最终选择方案是:用canvas.toDataYRL();来做转换获取视频的一个截图,添加到页面中,达到自动添加预览图的目的。 ... [详细]
  • Python中的PyInputPlus模块原文:https ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • 巧用arguments在Javascript的函数中有个名为arguments的类数组对象。它看起来是那么的诡异而且名不经传,但众多的Javascript库都使用着它强大的功能。所 ... [详细]
  • 人脸检测 pyqt+opencv+dlib
    一、实验目标绘制PyQT界面,调用摄像头显示人脸信息。在界面中,用户通过点击不同的按键可以实现多种功能:打开和关闭摄像头, ... [详细]
  • 注:根据Qt小神童的视频教程改编概论:利用最新的Qt5.1.1在windows下开发的一个小的时钟程序,有指针与表盘。1.Qtforwindows开发环境最新的Qt已经集 ... [详细]
  • flutter插件搜索及最新依赖包查找
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了flutter插件搜索及最新依赖包查找相关的知识,希望对你有一定的参考价值。一.flutter中包和插件搜索平台 ... [详细]
author-avatar
夜翊灬瞳_398
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有