Flutter倒计时功能插件advanced_countdown的使用

发布于 1周前 作者 caililin 来自 Flutter

Flutter倒计时功能插件advanced_countdown的使用

advanced_countdown 是一个高级倒计时小部件,可以显示带有数字动画的时间。

PREVIEW.gif

AdvancedCountdown 参数

参数 描述 类型 必填 默认值
value 要显示的值 Duration Duration.zero
animationDuration HH、MM、SS 的动画持续时间 Duration defaultAnimationDuration
animationMillisecondsDuration MS 的动画持续时间 Duration defaultMillisecondsAnimationDuration
transitionBuilder 数字过渡构建器 AnimatedSwitcherTransitionBuilder? (默认过渡)
style 文本样式 TextStyle? DefaultTextStyle.of(context).style
displayHours 是否显示小时 bool false
displayMilliseconds 是否显示毫秒 bool false
hoursFormat 小时的显示格式 DurationFormat DurationMillisFormat.single
minutesFormat 分钟的显示格式 DurationFormat DurationMillisFormat.single
secondsFormat 秒的显示格式 DurationFormat DurationMillisFormat.double
millisecondsFormat 毫秒的显示格式 DurationMillisFormat DurationMillisFormat.single

示例代码

以下是一个完整的示例代码,展示了如何使用 advanced_countdown 插件:

import 'dart:async';

import 'package:advanced_countdown/advanced_countdown.dart';
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  @override
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final _durationForward = ValueNotifier(Duration.zero);
  final _durationBackward = ValueNotifier(
    const Duration(minutes: 59, seconds: 59),
  );
  final _durationMillis = ValueNotifier(Duration.zero);

  Timer? _timer;
  Timer? _timerMillis;

  @override
  void initState() {
    super.initState();

    _startTimers();
  }

  @override
  void reassemble() {
    super.reassemble();

    _startTimers();
  }

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              const Text('ADVANCED COUNTDOWN'),
              Row(
                mainAxisSize: MainAxisSize.min,
                children: [
                  ValueListenableBuilder(
                    valueListenable: _durationForward,
                    builder: (context, value, child) {
                      return AdvancedCountdown(
                        value: value,
                        animationDuration: const Duration(milliseconds: 250),
                        style: Theme.of(context).textTheme.displayMedium,
                        minutesFormat: DurationFormat.double,
                        secondsFormat: DurationFormat.double,
                      );
                    },
                  ),
                  const SizedBox(width: 40),
                  ValueListenableBuilder(
                    valueListenable: _durationBackward,
                    builder: (context, value, child) {
                      return AdvancedCountdown(
                        value: value,
                        animationDuration: const Duration(milliseconds: 250),
                        style: Theme.of(context).textTheme.displayMedium,
                        minutesFormat: DurationFormat.double,
                        secondsFormat: DurationFormat.double,
                      );
                    },
                  ),
                ],
              ),
              ValueListenableBuilder(
                valueListenable: _durationMillis,
                builder: (context, value, child) {
                  return AdvancedCountdown(
                    value: value,
                    animationMillisecondsDuration: const Duration(milliseconds: 100),
                    style: Theme.of(context).textTheme.displayMedium,
                    displayHours: true,
                    displayMilliseconds: true,
                    secondsFormat: DurationFormat.double,
                    millisecondsFormat: DurationMillisFormat.double,
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }

  @override
  void dispose() {
    _timer?.cancel();
    _timerMillis?.cancel();

    super.dispose();
  }

  void _startTimers() {
    _timer?.cancel();
    _timer = Timer.periodic(
      const Duration(seconds: 1),
      _handleTimerUpdate,
    );

    _timerMillis?.cancel();
    _timerMillis = Timer.periodic(
      const Duration(milliseconds: 100),
      _handleTimerMillisUpdate,
    );
  }

  void _handleTimerUpdate(Timer timer) {
    _durationForward.value += const Duration(seconds: 1);
    _durationBackward.value -= const Duration(seconds: 1);

    if (_durationForward.value.inSeconds % 60 == 0) {
      _durationForward.value = Duration.zero;
    }

    if (_durationBackward.value.inSeconds % 60 == 0) {
      _durationBackward.value = const Duration(minutes: 59, seconds: 59);
    }
  }

  void _handleTimerMillisUpdate(Timer timer) {
    _durationMillis.value += const Duration(milliseconds: 100);

    if (_durationMillis.value.inSeconds % 60 >= 5) {
      _durationMillis.value = Duration.zero;
    }
  }
}

代码说明

  1. 导入必要的库

    import 'dart:async';
    import 'package:advanced_countdown/advanced_countdown.dart';
    import 'package:flutter/material.dart';
    
  2. 创建 MyApp_MyAppState

    • MyApp 是应用的入口点。
    • _MyAppStateMyApp 的状态管理类,包含倒计时逻辑。
  3. 初始化定时器

    • initState 方法中启动定时器。
    • reassemble 方法在热重载时重新启动定时器。
  4. 构建 UI

    • 使用 ValueListenableBuilder 监听 ValueNotifier 的变化,并更新 AdvancedCountdown 小部件。
    • 显示两个倒计时:一个向前计数,一个向后计数,以及一个包含毫秒的倒计时。
  5. 处理定时器更新

    • _handleTimerUpdate 方法每秒更新一次 durationForwarddurationBackward
    • _handleTimerMillisUpdate 方法每100毫秒更新一次 durationMillis
  6. 清理资源

    • dispose 方法中取消定时器,避免内存泄漏。

通过以上步骤,你可以轻松地在 Flutter 应用中实现带有动画效果的倒计时功能。


更多关于Flutter倒计时功能插件advanced_countdown的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter倒计时功能插件advanced_countdown的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter中使用advanced_countdown插件来实现倒计时功能的代码示例。advanced_countdown是一个功能强大的Flutter插件,可以用来创建和管理倒计时功能。

首先,确保你已经在pubspec.yaml文件中添加了advanced_countdown依赖:

dependencies:
  flutter:
    sdk: flutter
  advanced_countdown: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

以下是一个简单的Flutter应用示例,展示了如何使用advanced_countdown插件来实现倒计时功能:

import 'package:flutter/material.dart';
import 'package:advanced_countdown/advanced_countdown.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Countdown Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: CountdownDemo(),
    );
  }
}

class CountdownDemo extends StatefulWidget {
  @override
  _CountdownDemoState createState() => _CountdownDemoState();
}

class _CountdownDemoState extends State<CountdownDemo> {
  final AdvancedCountdownController _countdownController =
      AdvancedCountdownController();

  @override
  void initState() {
    super.initState();

    // 设置倒计时初始时间(例如:10秒)
    _countdownController.initialTime = 10;

    // 监听倒计时结束事件
    _countdownController.onComplete = () {
      print('Countdown completed!');
      // 可以在这里执行倒计时结束后的操作,比如显示一个提示信息
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('倒计时结束!')),
      );
    };

    // 开始倒计时
    _countdownController.start();
  }

  @override
  void dispose() {
    // 释放资源
    _countdownController.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Countdown Demo'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Text(
              '剩余时间: ${_countdownController.remainingTime.inSeconds} 秒',
              style: TextStyle(fontSize: 24),
            ),
            SizedBox(height: 20),
            ElevatedButton(
              onPressed: () {
                // 重置倒计时
                _countdownController.reset();
              },
              child: Text('重置倒计时'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                // 暂停倒计时
                _countdownController.pause();
              },
              child: Text('暂停倒计时'),
            ),
            SizedBox(height: 10),
            ElevatedButton(
              onPressed: () {
                // 如果倒计时已暂停,则继续倒计时
                if (_countdownController.isPaused) {
                  _countdownController.resume();
                }
              },
              child: Text('继续倒计时'),
            ),
          ],
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 创建了一个AdvancedCountdownController实例来控制倒计时。
  2. initState方法中,设置了倒计时的初始时间(10秒),并监听倒计时结束事件。
  3. 在UI中显示剩余时间,并提供按钮来重置、暂停和继续倒计时。

你可以根据具体需求调整倒计时的初始时间、监听的事件处理逻辑以及UI布局。希望这个示例对你有所帮助!

回到顶部