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

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 是应用的入口点。
    • _MyAppState 是 MyApp 的状态管理类,包含倒计时逻辑。
  3. 初始化定时器:

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

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

    • _handleTimerUpdate 方法每秒更新一次 durationForward 和 durationBackward。
    • _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布局。希望这个示例对你有所帮助!

回到顶部