如何自定义CircularCountDownTimer实现1小时周期循环填充动画
实现方法
你可以通过组件自带的参数和回调配置直接实现需求,不需要修改组件源码:
- 调整总计时长:将
duration参数从当前的60(对应1分钟)改为3600,匹配1小时的计时周期 - 调整填充方向:设置
isReverse: false,让环形从初始空白状态随时间推移逐步填充,计时结束时完全填满,符合正向填充的效果要求 - 配置自动循环逻辑:添加
onComplete回调,在每轮1小时计时结束、环形完全填充后,调用控制器的restart()方法自动重置到初始状态,开启下一轮计时 - 可选配置:如果不需要显示组件中间默认的计时数字,添加
isTimerTextShown: false隐藏即可,需要保留文本则可以通过textStyle自定义显示样式
修改后的完整可运行代码如下:
import 'package:circular_countdown_timer/circular_countdown_timer.dart'; import 'package:flutter/material.dart'; void main() { runApp(const MyApp()); } class MyApp extends StatelessWidget { const MyApp({Key? key}) : super(key: key); @override Widget build(BuildContext context) { return const MaterialApp( title: 'Flutter Demo', home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { const MyHomePage({Key? key, required this.title}) : super(key: key); final String title; @override State<MyHomePage> createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { final CountDownController controller = CountDownController(); @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text(widget.title), ), body: Center( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: <Widget>[ CircularCountDownTimer( width: 300, height: 300, duration: 3600, // 1小时对应3600秒 fillColor: Colors.blue, ringColor: Colors.blue.withOpacity(0.25), autoStart: false, controller: controller, isReverse: false, // 正向计时,从空环逐步填充至满环 isTimerTextShown: false, // 不需要显示中间计时文本可保留该配置 onComplete: () { // 一轮计时完成后自动重启,开启下一轮循环 controller.restart(); }, ), const SizedBox( height: 100, ), Row( mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ TextButton( onPressed: () { controller.start(); }, child: const Text("Start"), ), TextButton( onPressed: () { controller.pause(); }, child: const Text("Pause"), ), ], ), ], ), ), ); } }
内容的提问来源于stack exchange,提问作者OverdoseB12
相关产品推荐
相关产品推荐

