Flutter 学习之旅 之 flutter 实现简朴自界说的倒计时 CountdownTimer 功能 ...

打印 上一主题 下一主题

主题 973|帖子 973|积分 2919

Flutter 学习之旅 之 flutter 实现简朴自界说的倒计时 CountdownTimer 功能/监听倒计时开始/竣事/计时中的事件


目录
Flutter 学习之旅 之 flutter 实现简朴自界说的倒计时 CountdownTimer 功能/监听倒计时开始/竣事/计时中的事件
一、简朴先容
二、CountdownTimer
1、开发留意事项
2、利用留意事项
三、简朴效果展示
四、简朴案例实现
五、关键代码


一、简朴先容

Flutter 是一款开源的 UI 软件开发工具包,由 Google 开发和维护。它允许开发者利用一套代码同时构建跨平台的应用程序,包括移动设备(iOS 和 Android)、Web 和桌面平台(Windows、macOS 和 Linux)。
Flutter 利用 Dart 编程语言,它可以将代码编译为 ARM 或 Intel 呆板代码以及 JavaScript,从而实现快速的性能。Flutter 提供了一个丰富的预置小部件库,开发者可以根据自己的需求灵活地控制每个像素,从而创建自界说的、适应性强的筹划,这些筹划在任何屏幕上都能呈现精彩的外观和感觉。


二、CountdownTimer

CountdownTimer 是一个封装好的倒计时工具类,用于实现倒计时功能。它支持自界说倒计时总时长,并通过回调函数提供倒计时开始、竣事以及每秒事件的处理本领。此外,还支持停息、继续、制止和重置倒计时的操作,方便在不同场景下灵活控制倒计时过程。在 Flutter 应用中,通过简朴的调用即可实现复杂的倒计时逻辑,实用于验证码倒计时、运动倒计时等多种场景。
   在开发和利用 CountdownTimer 时,须要留意以下几点:
  1、开发留意事项

  

  • 避免内存泄漏

    • 确保在倒计时竣事或页面烧毁时取消定时器(_timer?.cancel()),避免定时器继续运行导致内存泄漏。
    • 在 dispose 方法中开释资源,例如:

      1. @override
      2. void dispose() {
      3.   _countdownTimer.stop();
      4.   super.dispose();
      5. }
      复制代码

  • 线程安全

    • Timer 是基于 Dart 的单线程模型运行的,因此不须要额外处理线程安全问题。但要确保在回调中更新 UI 时利用 setState 或其他符合的响应式方法。

  • 避免重复启动

    • 在调用 start 方法之前,建议先调用 stop 方法,确保不会重复启动定时器。例如:

      1. void start() {
      2.   stop();
      3.   _remainingTime = _duration;
      4.   _isPaused = false;
      5.   onStart();
      6.   _startTimer();
      7. }
      复制代码

  • 处理停息和继续逻辑

    • 停息时取消定时器,并设置 _isPaused = true。
    • 继续时重新启动定时器,并确保 _isPaused = false。

  • 回调函数的利用

    • 确保回调函数(onStart、onEnd、onTick)不会抛出非常,否则可能导致定时器无法正常工作。

  2、利用留意事项

  

  • 初始化参数

    • 在初始化 CountdownTimer 时,确保传入的 duration 参数大于 0,否则倒计时无法正常工作。

  • 按钮状态管理

    • 在 UI 中,根据倒计时的状态(开始、停息、继续、制止)动态更新按钮的可用状态,避免用户误操作。例如:

      1. bool isCounting = false;
      2. bool isPaused = false;
      3. void start() {
      4.   isCounting = true;
      5.   isPaused = false;
      6.   _countdownTimer.start();
      7. }
      8. void pause() {
      9.   isPaused = true;
      10.   _countdownTimer.pause();
      11. }
      12. void resume() {
      13.   isPaused = false;
      14.   _countdownTimer.resume();
      15. }
      16. void stop() {
      17.   isCounting = false;
      18.   _countdownTimer.stop();
      19. }
      复制代码

  • 避免重复调用

    • 在 UI 中,确保不会重复调用 start 方法。例如,可以利用一个标志位来判断倒计时是否已经在运行。

  • 倒计时竣过后重置

    • 假如须要在倒计时竣过后重新开始,建议调用 reset 方法重置倒计时。

  • 测试界限条件

    • 测试倒计时的界限条件,例如:

      • 倒计时时间非常短(如 1 秒)。
      • 倒计时时间非常长(如数小时)。
      • 在倒计时过程中频繁停息和继续。


  • 适配不同设备

    • 确保倒计时在不同设备(如手机、平板、Web)上表现同等,特别是在时间精度和 UI 更新方面。

  • 用户反馈

    • 在倒计时过程中,为用户提供明白的反馈,例如显示剩余时间、倒计时竣事的提示等。

  通过留意以上事项,可以确保 CountdownTimer 在开发和利用过程中更加稳定、可靠,而且能够满足各种实际需求。
  
三、简朴效果展示



四、简朴案例实现

1、这里利用 Android Studio 进行创建 Flutter 项目

2、创建一个 application 的 Flutter 项目

3、初次的项目结构如下

4、编写实现 CountdownTimer 功能

5、在 main 中测试 倒计时功能

6、毗连设备,运行效果如下


五、关键代码

1、CountdownTimer
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. class CountdownTimer {
  4.   int _duration; // 倒计时总时长(单位:秒)
  5.   Timer? _timer; // 定时器对象,用于每秒触发一次事件
  6.   int _remainingTime = 0; // 剩余时间(单位:秒)
  7.   bool _isPaused = false; // 标志,表示倒计时是否处于暂停状态
  8.   // 回调函数
  9.   final VoidCallback onStart; // 倒计时开始时触发的回调
  10.   final VoidCallback onEnd; // 倒计时结束时触发的回调
  11.   final ValueChanged<int> onTick; // 每秒触发的回调,参数为剩余时间
  12.   // 构造函数,初始化倒计时总时长和回调函数
  13.   CountdownTimer({
  14.     required int duration, // 倒计时时间(单位:秒)
  15.     required this.onStart, // 倒计时开始事件
  16.     required this.onEnd, // 倒计时结束事件
  17.     required this.onTick, // 倒计时期间秒事件
  18.   }) : _duration = duration;
  19.   // 开始倒计时
  20.   void start() {
  21.     // 首先调用 stop 方法,确保之前的倒计时(如果存在)被停止
  22.     stop();
  23.     // 将剩余时间设置为倒计时总时长
  24.     _remainingTime = _duration;
  25.     // 将暂停标志设置为 false
  26.     _isPaused = false;
  27.     // 触发倒计时开始事件
  28.     onStart();
  29.     // 调用内部方法 _startTimer,启动定时器
  30.     _startTimer();
  31.   }
  32.   // 暂停倒计时
  33.   void pause() {
  34.     // 将暂停标志设置为 true
  35.     _isPaused = true;
  36.     // 取消当前的定时器
  37.     _timer?.cancel();
  38.   }
  39.   // 继续倒计时
  40.   void resume() {
  41.     // 检查是否处于暂停状态
  42.     if (_isPaused) {
  43.       // 将暂停标志设置为 false
  44.       _isPaused = false;
  45.       // 调用内部方法 _startTimer,重新启动定时器
  46.       _startTimer();
  47.     }
  48.   }
  49.   // 停止倒计时
  50.   void stop() {
  51.     // 取消当前的定时器
  52.     _timer?.cancel();
  53.     // 将剩余时间设置为 0
  54.     _remainingTime = 0;
  55.     // 将暂停标志设置为 false
  56.     _isPaused = false;
  57.   }
  58.   // 重置倒计时
  59.   void reset() {
  60.     // 调用 stop 方法,停止倒计时
  61.     stop();
  62.     // 将剩余时间设置为倒计时总时长
  63.     _remainingTime = _duration;
  64.   }
  65.   // 内部方法:启动定时器
  66.   void _startTimer() {
  67.     // 创建一个每秒触发一次的定时器
  68.     _timer = Timer.periodic(const Duration(seconds: 1), (timer) {
  69.       // 检查是否处于暂停状态,且剩余时间是否大于 0
  70.       if (!_isPaused && _remainingTime > 0) {
  71.         // 减少剩余时间
  72.         _remainingTime--;
  73.         // 触发每秒事件,将剩余时间作为参数传递
  74.         onTick(_remainingTime);
  75.       } else if (_remainingTime <= 0) {
  76.         // 如果剩余时间小于或等于 0,取消定时器
  77.         timer.cancel();
  78.         // 触发倒计时结束事件
  79.         onEnd();
  80.       }
  81.     });
  82.   }
  83. }
复制代码
  代码阐明:
  

  • 变量界说

    • _duration:倒计时的总时长,单位为秒。
    • _timer:Timer 对象,用于实现每秒触发一次的倒计时功能。
    • _remainingTime:当前剩余的时间,单位为秒。
    • _isPaused:布尔值,用于标志倒计时是否处于停息状态。

  • 构造函数

    • 接收倒计时总时长和三个回调函数(onStart、onEnd、onTick)。
    • 初始化 _duration 为传入的倒计时总时长。

  • start 方法

    • 调用 stop 方法确保之前的倒计时被制止。
    • 将剩余时间设置为倒计时总时长。
    • 将停息标志设置为 false。
    • 触发倒计时开始事件。
    • 调用 _startTimer 方法启动定时器。

  • pause 方法

    • 将停息标志设置为 true。
    • 取消当前的定时器。

  • resume 方法

    • 检查是否处于停息状态。
    • 假如处于停息状态,将停息标志设置为 false,并重新启动定时器。

  • stop 方法

    • 取消当前的定时器。
    • 将剩余时间设置为 0。
    • 将停息标志设置为 false。

  • reset 方法

    • 调用 stop 方法制止倒计时。
    • 将剩余时间设置为倒计时总时长。

  • _startTimer 内部方法

    • 创建一个每秒触发一次的定时器。
    • 在定时器的回调中:

      • 检查是否处于停息状态,且剩余时间是否大于 0。
      • 假如满足条件,减少剩余时间,并触发每秒事件。
      • 假如剩余时间小于或等于 0,取消定时器并触发倒计时竣事事件。


  通过这些详细的注释,你可以更好地理解代码的逻辑和实现细节。
  
2、main
  1. import 'package:flutter/material.dart';
  2. import 'package:test_countdown_timer/countdown_timer.dart'; // 导入封装好的倒计时工具类
  3. void main() {
  4.   runApp(const MyApp()); // 启动应用
  5. }
  6. class MyApp extends StatelessWidget {
  7.   const MyApp({super.key});
  8.   @override
  9.   Widget build(BuildContext context) {
  10.     return MaterialApp(
  11.       home: Scaffold(
  12.         appBar: AppBar(
  13.           title: const Text('倒计时示例'), // 应用的标题
  14.         ),
  15.         body: const CountdownExample(), // 倒计时示例页面
  16.       ),
  17.     );
  18.   }
  19. }
  20. class CountdownExample extends StatefulWidget {
  21.   const CountdownExample({super.key});
  22.   @override
  23.   _CountdownExampleState createState() => _CountdownExampleState();
  24. }
  25. class _CountdownExampleState extends State<CountdownExample> {
  26.   late CountdownTimer _countdownTimer; // 倒计时工具类实例
  27.   int _remainingTime = 60; // 默认倒计时时间(单位:秒)
  28.   @override
  29.   void initState() {
  30.     super.initState();
  31.     // 初始化倒计时工具类实例,传入默认倒计时时间以及各个回调函数
  32.     _countdownTimer = CountdownTimer(
  33.       duration: _remainingTime,
  34.       onStart: () {
  35.         print('倒计时开始'); // 倒计时开始时打印日志
  36.       },
  37.       onEnd: () {
  38.         print('倒计时结束'); // 倒计时结束时打印日志
  39.       },
  40.       onTick: (remainingTime) {
  41.         setState(() {
  42.           _remainingTime = remainingTime; // 更新剩余时间
  43.         });
  44.       },
  45.     );
  46.   }
  47.   @override
  48.   void dispose() {
  49.     _countdownTimer.stop();
  50.     super.dispose();
  51.   }
  52.   @override
  53.   Widget build(BuildContext context) {
  54.     return Center(
  55.       child: Column(
  56.         mainAxisAlignment: MainAxisAlignment.center, // 垂直居中对齐
  57.         children: <Widget>[
  58.           Text('倒计时: $_remainingTime 秒'), // 显示剩余时间
  59.           ElevatedButton(
  60.             onPressed: () {
  61.               _countdownTimer.start(); // 调用倒计时工具类的 start 方法开始倒计时
  62.             },
  63.             child: const Text('开始倒计时'), // 按钮文本
  64.           ),
  65.           ElevatedButton(
  66.             onPressed: () {
  67.               _countdownTimer.pause(); // 调用倒计时工具类的 pause 方法暂停倒计时
  68.             },
  69.             child: const Text('暂停倒计时'), // 按钮文本
  70.           ),
  71.           ElevatedButton(
  72.             onPressed: () {
  73.               _countdownTimer.resume(); // 调用倒计时工具类的 resume 方法继续倒计时
  74.             },
  75.             child: const Text('继续倒计时'), // 按钮文本
  76.           ),
  77.           ElevatedButton(
  78.             onPressed: () {
  79.               _countdownTimer.stop(); // 调用倒计时工具类的 stop 方法停止倒计时
  80.             },
  81.             child: const Text('停止倒计时'), // 按钮文本
  82.           ),
  83.           ElevatedButton(
  84.             onPressed: () {
  85.               _countdownTimer.reset(); // 调用倒计时工具类的 reset 方法重置倒计时
  86.               setState(() {
  87.                 _remainingTime = 60; // 重置剩余时间为默认值
  88.               });
  89.             },
  90.             child: const Text('重置倒计时'), // 按钮文本
  91.           ),
  92.         ],
  93.       ),
  94.     );
  95.   }
  96. }
复制代码
  详细注释阐明:
  

  • 导入模块

    • import 'package:flutter/material.dart';:导入 Flutter 的 Material 组件库,用于构建 UI。
    • import 'package:test_countdown_timer/countdown_timer.dart';:导入封装好的倒计时工具类 CountdownTimer。

  • main 函数

    • void main() { runApp(const MyApp()); }:应用的入口点,启动应用。

  • MyApp 类

    • class MyApp extends StatelessWidget:界说一个无状态的 Flutter 应用。
    • build 方法:构建应用的根组件,包含一个 Scaffold,其 appBar 显示标题,body 显示倒计时示例页面。

  • CountdownExample 类

    • class CountdownExample extends StatefulWidget:界说一个有状态的倒计时示例页面。
    • _CountdownExampleState 类:CountdownExample 的状态类,用于管理倒计时的状态。

  • _CountdownExampleState 类

    • _countdownTimer:倒计时工具类的实例。
    • _remainingTime:当前剩余时间,初始值为 60 秒。
    • initState 方法:初始化倒计时工具类实例,传入默认倒计时时间以及各个回调函数。

      • onStart:倒计时开始时触发的回调,打印日记。
      • onEnd:倒计时竣事时触发的回调,打印日记。
      • onTick:每秒触发的回调,更新剩余时间并调用 setState 刷新 UI。

    • build 方法:构建倒计时示例页面的 UI,包含一个显示剩余时间的文本和五个按钮,分别用于控制倒计时的开始、停息、继续、制止和重置。

  • 按钮功能

    • 开始倒计时:调用 _countdownTimer.start() 方法开始倒计时。
    • 停息倒计时:调用 _countdownTimer.pause() 方法停息倒计时。
    • 继续倒计时:调用 _countdownTimer.resume() 方法继续倒计时。
    • 制止倒计时:调用 _countdownTimer.stop() 方法制止倒计时。
    • 重置倒计时:调用 _countdownTimer.reset() 方法重置倒计时,并将剩余时间重置为默认值。

  通过这些详细的注释,你可以更好地理解代码的逻辑和实现细节。
  

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

羊蹓狼

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表