第三百零二回

文章目录

  • 1. 概念介绍
  • 2. 实现方法
    • 2.1 使用Steam实现
    • 2.2 使用Timer实现
  • 3. 示例代码
  • 4. 内容总结

我们在上一章回中介绍了"如何实现每隔一段时间执行某项目任务"相关的内容,本章回中将介绍如何实现倒计时功能.闲话休提,让我们一起Talk Flutter吧。

在这里插入图片描述

1. 概念介绍

倒计时功能估计大家都熟悉,经常用在一些节目开始或者开奖活动中。程序中也会用到倒计时,比如在网上支付时会有一个支付成功的倒计时,显示多少秒后支付成功。本
章回中将详细介绍如何实现倒计时功能。

2. 实现方法

我们将介绍两种实现方法,一种通过Stream实现,另外一种通过Timer实现,接下来的小节中,我们将详细介绍这两种方法的实现过程。

2.1 使用Steam实现

  • 创建一个倒计时可用的时间,这个时间与项目需求有关;
  • 创建Stream并且调用periodic方法来启动计时功能;
  • 使用StreamBuilder组件监听Stream中数值的变化;
  • 在StreamBuilder中显示倒计时数值,结束时停止显示倒计时数值;

2.2 使用Timer实现

  • 创建一个倒计时可用的时间,这个时间与项目需求有关;
  • 创建Timer对象并且调用它的periodic方法来启动计时功能;
  • 使用Text组件显示时间值,并且通过setState()方法更新时间值;

3. 示例代码

///使用Stream实现倒计时功能
int countdownClock = 10;

StreamBuilder(
  ///InitiData是event的初始值,但是它显示完初始化值后马上又变成了0
  stream: Stream.periodic(const Duration(seconds: 1),(event)=>(countdownClock-event)).take(countdownClock+1),
  initialData: 0,
  builder: (context,data){
    if(data.data != null && data.data == 0) {
      return Text("starting",style: const TextStyle(color: Colors.black),);
    }
    return Text("${data.data.toString()} s",style: const TextStyle(color: Colors.black),
);


///自己实现的计时器,和Stream.periodic()方法的原理相同,不同之处在于可以控制事件的逻辑,Stream中只能是做加法
TextButton(
  onPressed: () {
    Timer.periodic(const Duration(seconds: 1,), (timer) {
      setState(() {
        countdownTime++;
        if(countdownTime == 5) {
          timer.cancel();
        }
      });
    });
  },
  child: countdownTime == 0 ? const Text("Start") : Text(countdownTime.toString()),
),
///模拟上一个内容,做成倒计时,不过需要先启动上一个按钮,加到5以后才能启动下一个按钮
TextButton(
  onPressed: () {
    Timer.periodic(const Duration(seconds: 1,), (timer) {
      setState(() {
        countdownTime--;
        if(countdownTime == 0) {
          timer.cancel();
        }
      });
    });
  },
  child: countdownTime != 0 ? const Text("Start") : Text(countdownTime.toString()),
),

上面的示例代码中演示了两种创建倒计时的方法,它们在原理上是相同的,都是使用了Timer的periodic方法来实现计时功能。相比较而言,Timer更加灵活一些,它可
以对数值进行加法或者减法等灵活操作。Stream则只能进行了加法操作,为此我们在代码中通过作差来实现减法功能。我在这里就不演示程序的运行结果了,建议大家
自己动手去实践,这样可以看到数值在变化,直到0才停止计时。

4. 内容总结

最后,我们对本章回的内容做一个全面总结:

  • 使用Stream的periodic方法可以实现倒计时功能;
  • 使用Timer的periodic方法也可以实现倒计时功能;
  • 两种方法相比较后就会发现使用Timer实现倒计时功能更加灵活一些;
    看官们,与"如何实现倒计时功能"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/366517.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ELK集群搭建(基础教程)

ELK集群搭建(基础教程) 目录: 机器准备 集群内各台机器安装Elasticsearch 安装部署Kafka(注:每个节点都配置,注意ip不同) 安装logstash工具 安装filebeat ELK收集Nginx的json日志 ELK收集Nginx正常日志和错误日…

用纯OpenAI的API,实现手机流量包智能客服

import json from openai import OpenAI from dotenv import load_dotenv, find_dotenv _ load_dotenv(find_dotenv())def print_json(data):"""打印参数。如果参数是有结构的(如字典或列表),则以格式化的 JSON 形式打印&…

容器化对数据库的性能有影响吗?

引言 容器化是一种将应用程序及其依赖项打包到一个独立、可移植的运行环境中的技术。容器化技术通过使用容器运行时引擎(比如Docker/Containerd)来创建、部署和管理容器。Kubernetes(通常简称为 k8s)是一个开源的容器编排和管理平…

谷粒商城【成神路】-【3】——三级分类

目录 🍿1.查询三级分类 🧂2.前端页面搭建 🍟3.添加网关 🍳4.解决跨域 🧇5.显示分类 🥞6.显示复选框 1.查询三级分类 1.controller 直接调用service层的接口 RequestMapping("/list/tree&qu…

多线程(进阶三:JUC)

一、Callable接口 二、reentrantLock 三、原子类 四、线程池 五、信号量 Semaphore 六、CountDownLatch JUC即java.utill.concurrent,里面放了一些多线程编程时有用的类,下面是里面的一些类。 一、Callable接口 1、创建线程的操作 多线程编程时&a…

day02.C++命名空间

目录 一、命名空间的作用 二、命名空间的定义 三、命名空间的镶嵌定义 四、命名空间的使用方法 一、命名空间的作用 一个中大型软件往往由多名程序员共同开发,会使用大量的变量和函数,不可避免地会出现变量或函数的命名冲突。当所有人的代码都测试通过…

将有逻辑关系的树形结构数组转换为扁平化的一维对象数组(包含PID、ID父子关系)(tree转换为List)

// 将有逻辑关系的树形结构数组转换为扁平化的一维对象数组 treeStructure2flatArray(arr) {let r [], r_ (ar, PID root) > ar.forEach(v > (v.children && (r_(v.children, v.ID), delete v.children), (v.PID PID, r.push(v))));r_(JSON.parse(JSON.strin…

LeetCode 热题 100 | 链表(中上)

目录 1 141. 环形链表 1.1 哈希表 1.2 快慢指针 2 142. 环形链表 II 2.1 哈希表 2.2 快慢指针 3 21. 合并两个有序链表 4 2. 两数相加 菜鸟做题第三周,语言是 C 1 141. 环形链表 1.1 哈希表 解题思路:遍历链表,在哈希表中…

用Audio2Face导出Unity面部动画

开始之前说句话,新年前最后一篇文章了 一定别轻易保存任何内容,尤其是程序员不要轻易Ctrl S 在A2F去往Unity的路上,还要经历特殊Blender,自己电脑中已下载好的可能不是很好使。 如果想查看UE相关的可以跳转到下边这两篇链接 1. …

追觅科技发布全折叠高速吹风机Pocket

2月2日,追觅科技召开2024新品发布会,一系列年度新品亮相。现场,追觅科技发布了个护重磅新品——追觅Pocket折叠高速吹风机,这也是行业首个全折叠高速吹风机。 创新柔性折叠技术,直卷吹一机全能 追觅Pocket折叠高速吹风…

Dash :一个超漂亮的 python Web库!

你好,Dash 是一个非常方便的 Python 库,它可以非常非常帮助你构建基于 Web 的应用程序,而且最棒的是你无需使用 JavaScript! 不仅如此,Dash 还是一个专门用于创建分析 Web 应用程序的用户界面库。 如果你是一个使用 …

沟通管理和相关方管理核心考点梳理

个人总结,仅供参考,欢迎加好友一起讨论 PMP - 沟通管理和相关方管理核心考点梳理 沟通管理和相关方(干系人)管理这两章放在一起进行梳理,这两章很多的考点很容易混淆,经常会纠结于一些题目,究竟…

三层架构思想

(一)回顾 面向对象设计原则: 各司其职(单一职责):每个Java对象的职责尽可能单一,每个Java对象只负责做某一件事,目的是为了简单化。 解耦合(开闭原则)&…

深度学习入门笔记(一)必备数学基础知识

本节中,我们先来介绍一些深度学习中必备的数学知识,有些是大学课堂讲过的,还有些可能没有,对于第一次见到的知识,可以先不用深究,了解概念即可,再后面应用的时候可以翻过头再看。 1.1 线性代数…

github请求超时解决方法

github请求超时解决办法 我使用windows执行如下git命令,提示超时 git clone xxxxx命令行提示如下: Failed to connect to github.com port 443: Timed out问题排查 可我Chrome可以正常访问github甚至ChatGPT,但是为什么在命令行里面却无法访问&#…

OpenAI 悄悄升级 ChatGPT;王腾:小米手机用户忠诚度安卓第一丨 RTE 开发者日报 Vol.140

开发者朋友们大家好: 这里是「RTE 开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE (Real Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「…

Java中的常用API

常用API Object类浅克隆与深克隆 ObjectsObjects中的equals 包装类StringBuilder和StringBufferStringBuilder是可变字符串对象StringBuffer线程安全案例![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/87649c20e6464113a42aee5f16f1ee22.png) StringJoiner Object…

鸿蒙harmony--自定义组件

今天是2月1日,星期四,二月的第一条祝福送给你,愿你目之所及皆是欢喜,心之所想皆能如愿,希望在新的一年里,我们都能越来越好。 目录 一,定义 二,自定义组件的基本用法 三,…

生产问题排查系列——未知404状态接口请求

引言 我们的产品主打金融服务领域,以B端客户为我们的核心合作伙伴,然而,我们的服务最终将惠及C端消费者。在技术实现上,我们采用了公司自主研发的微服务框架,该框架基于SpringBoot,旨在提供高效、可靠的服…

【FPGA VerilogModelsim】 8bitBCD码60计数器

可私信获取整个项目文件 8bit 即有8位二进制 BCD码 ,全称Binary-Coded Decimal,简称BCD码或者二-十进制代码 利用四位二进制(0000-1111)16个中选择10个作为十进制0-9; 常见的BCD码是8421码 本项目使用两组BCD码(每组4bit,共8bit,故称为8bitBCD)(高位0-5,低位0-9…