Flutter倒计时功能插件advanced_countdown的使用
Flutter倒计时功能插件advanced_countdown的使用
advanced_countdown
是一个高级倒计时小部件,可以显示带有数字动画的时间。
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;
}
}
}
代码说明
-
导入必要的库:
import 'dart:async'; import 'package:advanced_countdown/advanced_countdown.dart'; import 'package:flutter/material.dart';
-
创建
MyApp
和_MyAppState
类:MyApp
是应用的入口点。_MyAppState
是MyApp
的状态管理类,包含倒计时逻辑。
-
初始化定时器:
- 在
initState
方法中启动定时器。 reassemble
方法在热重载时重新启动定时器。
- 在
-
构建 UI:
- 使用
ValueListenableBuilder
监听ValueNotifier
的变化,并更新AdvancedCountdown
小部件。 - 显示两个倒计时:一个向前计数,一个向后计数,以及一个包含毫秒的倒计时。
- 使用
-
处理定时器更新:
_handleTimerUpdate
方法每秒更新一次durationForward
和durationBackward
。_handleTimerMillisUpdate
方法每100毫秒更新一次durationMillis
。
-
清理资源:
- 在
dispose
方法中取消定时器,避免内存泄漏。
- 在
通过以上步骤,你可以轻松地在 Flutter 应用中实现带有动画效果的倒计时功能。
更多关于Flutter倒计时功能插件advanced_countdown的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于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('继续倒计时'),
),
],
),
),
);
}
}
在这个示例中,我们做了以下几件事:
- 创建了一个
AdvancedCountdownController
实例来控制倒计时。 - 在
initState
方法中,设置了倒计时的初始时间(10秒),并监听倒计时结束事件。 - 在UI中显示剩余时间,并提供按钮来重置、暂停和继续倒计时。
你可以根据具体需求调整倒计时的初始时间、监听的事件处理逻辑以及UI布局。希望这个示例对你有所帮助!