You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自定义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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 17:47:37