本文微信公众号「AndroidTraveler」首发。

今天给大家讲讲 Flutter 里面定时器/倒计时的实现。

一般有两种场景:

  1. 我只需要你在指定时间结束后回调告诉我。回调只需要一次。
  2. 我需要你在指定时间结束后回调告诉我。回调可能多次。

下面针对这两种场景,我们来说下如何在 Flutter 里面使用。

回调一次的定时器

const timeout = const Duration(seconds: 5);
print('currentTime='+DateTime.now().toString());
Timer(timeout, () {//到时回调print('afterTimer='+DateTime.now().toString());
});

这里我们设置了超时时间为 5 秒。然后启动一个定时器,等到 5 秒时候到了,就会执行回调方法。

我们在定时器启动之前和之后都加上了打印日志,控制台打印输出如下:

flutter: currentTime=2019-06-08 13:56:35.347493
flutter: afterTimer=2019-06-08 13:56:40.350412

用法总结起来就是:

1.设置超时时间 timeout
2.启动定时器 Timer(timeout, callback)
3.处理回调 callback

回调多次的定时器

回调多次的定时器用法和回调一次的差不多,区别有下面两点:

  1. API 调用不同
  2. 需要手动取消,否则会一直回调,因为是周期性的

一样的我们通过一个简单的小例子来说明:

int count = 0;
const period = const Duration(seconds: 1);
print('currentTime='+DateTime.now().toString());
Timer.periodic(period, (timer) {//到时回调print('afterTimer='+DateTime.now().toString());count++;if (count >= 5) {//取消定时器,避免无限回调timer.cancel();timer = null;}
});

这里我们的功能是每秒回调一次,当达到 5 秒后取消定时器,一共 回调了 5 次。

控制台输出如下:

flutter: currentTime=2019-06-08 14:16:02.906858
flutter: afterTimer=2019-06-08 14:16:03.909963
flutter: afterTimer=2019-06-08 14:16:04.910538
flutter: afterTimer=2019-06-08 14:16:05.911942
flutter: afterTimer=2019-06-08 14:16:06.911741
flutter: afterTimer=2019-06-08 14:16:07.910227

用法总结起来就是:

1.设置周期回调时间 period
2.启动定时器 Timer.periodic(period, callback(timer))
3.处理回调 callback(timer)
4.记得在合适时机取消定时器,否则会一直回调

好了,有了上面的知识储备,接下来,让我们进入实战讲解环节。

实战讲解

业务场景

服务器返回一个时间,你根据服务器的时间和当前时间的对比,显示倒计时,倒计时的时间在一天之内,超过一天显示默认文案即可。

场景分析

这个业务场景在倒计时这一块就需要使用到我们上面的知识了。由于限定了倒计时是在一天之内,所以显示的文案就是从 00:00:00 到 23:59:59。

具体代码操作

基本思路:首先我们需要获得剩余时间,接着启动一个 1 秒的周期性定时器,然后每隔一秒更新一下文案。

直接上代码:

//时间格式化,根据总秒数转换为对应的 hh:mm:ss 格式
String constructTime(int seconds) {int hour = seconds ~/ 3600;int minute = seconds % 3600 ~/ 60;int second = seconds % 60;return formatTime(hour) + ":" + formatTime(minute) + ":" + formatTime(second);
}//数字格式化,将 0~9 的时间转换为 00~09
String formatTime(int timeNum) {return timeNum < 10 ? "0" + timeNum.toString() : timeNum.toString();
}//获取当期时间
var now = DateTime.now();
//获取 2 分钟的时间间隔
var twoHours = now.add(Duration(minutes: 2)).difference(now);
//获取总秒数,2 分钟为 120 秒
var seconds = twoHours.inSeconds;
//设置 1 秒回调一次
const period = const Duration(seconds: 1);
//打印一开始的时间格式,为 00:02:00
print(constructTime(seconds));
Timer.periodic(period, (timer) {//秒数减一,因为一秒回调一次seconds--;//打印减一后的时间print(constructTime(seconds));if (seconds == 0) {//倒计时秒数为0,取消定时器timer.cancel();timer = null;}
});

其实注释也写的很清楚了,就是基本思路的基础上增加了一些细节处理,这里演示是自己构造了一个两分钟的倒计时。

好了,基本到这里已经说完了,但是可能 Flutter 具体一些细节还不一样,这边直接给下一个倒计时的完整代码吧。

import 'dart:async';import 'package:flutter/material.dart';class Countdown extends StatefulWidget {@override_CountdownState createState() => _CountdownState();
}class _CountdownState extends State<Countdown> {Timer _timer;int seconds;@overrideWidget build(BuildContext context) {return Center(child: Text(constructTime(seconds)),);}//时间格式化,根据总秒数转换为对应的 hh:mm:ss 格式String constructTime(int seconds) {int hour = seconds ~/ 3600;int minute = seconds % 3600 ~/ 60;int second = seconds % 60;return formatTime(hour) + ":" + formatTime(minute) + ":" + formatTime(second);}//数字格式化,将 0~9 的时间转换为 00~09String formatTime(int timeNum) {return timeNum < 10 ? "0" + timeNum.toString() : timeNum.toString();}@overridevoid initState() {super.initState();//获取当期时间var now = DateTime.now();//获取 2 分钟的时间间隔var twoHours = now.add(Duration(minutes: 2)).difference(now);//获取总秒数,2 分钟为 120 秒seconds = twoHours.inSeconds;startTimer();}void startTimer() {//设置 1 秒回调一次const period = const Duration(seconds: 1);_timer = Timer.periodic(period, (timer) {//更新界面setState(() {//秒数减一,因为一秒回调一次seconds--;});if (seconds == 0) {//倒计时秒数为0,取消定时器cancelTimer();}});}void cancelTimer() {if (_timer != null) {_timer.cancel();_timer = null;}}@overridevoid dispose() {super.dispose();cancelTimer();}}

效果如下:

后续打算写一个 FlutterApp 涵盖我之前博客的例子,方便大家结合代码查看实际运行效果,敬请期待。

这边之前创建了一个知识星球,欢迎互联网小伙伴加入,一起学习,共同成长。
链接方式加入:
我正在「Flutter(限免)」和朋友们讨论有趣的话题,你一起来吧?
https://t.zsxq.com/MVrJiAY

扫码方式加入:

Flutter 快速上手定时器/倒计时及实战讲解相关推荐

  1. Flutter 快速上手,秒变大前端

    简介:近两年Flutter的热度不断提升,无论在阿里还是外部公司,参与Flutter生态建设的人越来越多.Flutter作为跨端的UI框架,未来也有很大的可能像Rax一样作为集团内营销活动页面搭建的D ...

  2. python selenium 关闭窗口_Selenium快速上手实战 | 上篇

    前言 Selenium是一个用于Web应用程序的自动化测试工具.它直接运行在浏览器中,可以模拟用户在浏览器上面的行为操作. 在AirtestIDE中,开发者也给我们提供了使用Selenium的窗口.不 ...

  3. 【JavaWeb篇】快速上手Tomcat|实战项目详解

    作者主页:橙子! 主页 系列专栏:JavaWeb基础教程系列 精彩回顾:HTTP协议详解 文章目的:Web服务器TomCat的使用以及配置问题 文章目录 前言 1.Web服务器 2.Tomcat简介 ...

  4. Golang语言快速上手到综合实战(Go语言、Beego框架、高并发聊天室、豆瓣电影爬虫) 下载

    下载Golang语言快速上手到综合实战(Go语言.Beego框架.高并发聊天室.豆瓣电影爬虫) 下载地址:请加QQ:397245854 Go是Google开发的一种编译型,可并行化,并具有垃圾回收功能 ...

  5. 【项目实战课】快速上手目标检测任务,MMdetection框架详细解读与案例实战

    欢迎大家来到我们的项目实战课,本期内容是<MMdetection框架解读与案例实战>. 所谓项目实战课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲 ...

  6. TensorFlow 2.0 快速上手教程与手写数字识别例子讲解

    文章目录 TensorFlow 基础 自动求导机制 参数优化 TensorFlow 模型建立.训练与评估 通用模型的类结构 多层感知机手写数字识别 Keras Pipeline * TensorFlo ...

  7. cass读取dat文件_南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器

    南方CASS教程+视频讲解+插件汇总,小白快速上手的测绘神器 自CASS软件推出以来,市场占有率遥遥领先,已经成为业内应用最广.使用最方便快捷的软件品牌.也是用户量最大.升级最快.服务最好的主流成图和 ...

  8. 编程初学者快速上手实战套路

    很多初学者刚开始学编程时,上来就只想着编码!编码!!编码!!! 但你知道什么是编程吗? 要知道:编码≠编程 今天就为大家介绍一种快速上手的编程套路,在套路的基础上编码有如神助! 学过Java语法的童鞋 ...

  9. Java初学者快速上手之实战“套路”

    很多初学者刚开始学编程时,上来就只想着编码!编码!!编码!!! 但你知道什么是编程吗? 要知道:编码≠编程 今天就为大家介绍一种快速上手的编程套路,在套路的基础上编码有如神助! 学过Java语法的童鞋 ...

最新文章

  1. 为AI摄影铺路,第一个大规模的美学质量数据库
  2. 阿拉伯数字转为罗马数字
  3. 简单的启动代码 IMPORT |Image$$RO$$Limit|
  4. SAP CRM text determination调试
  5. ubuntu服务器ssh登录密码修改,Ubuntu-18.04 下修改root用户密码,安装SSH服务,允许root用户远程登录,安装vsftp服务器...
  6. 计算机键盘输入法基础知识,教程计算机基础知识-:认识输入法
  7. 【UVA10562】Undraw the Trees(括号表示法输出树+fegts读取)
  8. jhipster使用简明教程
  9. Win7英伟达控制面板点击没有反应的解决办法
  10. 【C语言】通讯录制作
  11. FileviewPro万能文件查看器
  12. 一文简单了解粒子群算法(PSO)
  13. 高校固定资产折旧使用计算机,高校固定资产管理系统功能介绍
  14. 时钟周期 指令周期 MIPS CPI
  15. 《程序员必读之软件架构》作者Simon Brown:架构师与程序员的区别
  16. 本地服务(local Service)的实现
  17. MySQL所有问答题
  18. d盘莫名其妙被占空间 win10_为何联想电脑的win10系统d盘突然显示储存空间不足...
  19. 拼手气红包java_拼手气红包-基于继承实现(Java萌新篇)
  20. 别让邮件营销成为鸡肋---53KF

热门文章

  1. 服务器购买之后要做什么(二)
  2. java提示程序包不存在,解决:Error:java xxxx 程序包不存在
  3. 转录因子VaERF16和VaMYB306相互作用增强葡萄对灰霉病的抗性
  4. 阿里云Linux服务器上安装dubbo-admin管理控制台
  5. 什么是用户感?看看这4个产品经理的感性设计
  6. 与编程密切相关的数学——离散数学——代数系统篇
  7. java把汉字转换成拼音_Java实现汉字转换为拼音
  8. 指纹识别综述(7): 指纹合成
  9. 程序员如何提高自己的逻辑思维和技术水平
  10. xman的思维导图快捷键_macz技巧分享:思维导图XMind快捷键汇总