Flutter SlideCountdown自动重置问题:倒计时结束后自动重启,初始状态不重启
问题解决:SlideCountdown倒计时结束自动重启,初始状态不触发重启
你的代码问题在于,倒计时结束后仅通过setState更新_countdownDuration,但SlideCountdown组件并不会自动重新初始化倒计时。要实现倒计时结束后自动重启,同时保证初始加载时正常启动不触发重启,可以通过以下两种方式解决:
方案一:使用SlideCountdownController控制重启(推荐)
通过控制器可以更精准地控制倒计时的启停与重置,代码逻辑更清晰:
import 'package:flutter/material.dart'; import 'package:slide_countdown/slide_countdown.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( home: ExampleSlideCountdown(), ); } } class ExampleSlideCountdown extends StatefulWidget { const ExampleSlideCountdown({Key? key}) : super(key: key); @override _ExampleSlideCountdownState createState() => _ExampleSlideCountdownState(); } class _ExampleSlideCountdownState extends State<ExampleSlideCountdown> { final Duration _initialDuration = const Duration(minutes: 0, seconds: 10); late SlideCountdownController _countdownController; @override void initState() { super.initState(); // 初始化控制器,绑定初始时长 _countdownController = SlideCountdownController( duration: _initialDuration, ); } @override void dispose() { // 记得销毁控制器,避免内存泄漏 _countdownController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Countdown Timer'), ), body: SizedBox.expand( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Padding( padding: EdgeInsets.only(top: 20, bottom: 10), child: Text('Countdown Timer'), ), Container( height: 200, width: 200, child: SlideCountdown( controller: _countdownController, style: const TextStyle(fontSize: 40), onDone: () { // 倒计时结束后,重置控制器并重启 _countdownController.reset(); _countdownController.start(); }, ), ), ], ), ), ); } }
方案二:通过UniqueKey强制组件重建
如果不想使用控制器,可以给SlideCountdown添加唯一Key,每次倒计时结束后更新Key,强制组件重新创建并启动新的倒计时:
import 'package:flutter/material.dart'; import 'package:slide_countdown/slide_countdown.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( home: ExampleSlideCountdown(), ); } } class ExampleSlideCountdown extends StatefulWidget { const ExampleSlideCountdown({Key? key}) : super(key: key); @override _ExampleSlideCountdownState createState() => _ExampleSlideCountdownState(); } class _ExampleSlideCountdownState extends State<ExampleSlideCountdown> { late Duration _countdownDuration; final Duration _initialDuration = const Duration(minutes: 0, seconds: 10); // 初始化唯一Key late Key _countdownKey; @override void initState() { super.initState(); _countdownDuration = _initialDuration; _countdownKey = UniqueKey(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: const Text('Countdown Timer'), ), body: SizedBox.expand( child: Column( mainAxisAlignment: MainAxisAlignment.center, children: [ const Padding( padding: EdgeInsets.only(top: 20, bottom: 10), child: Text('Countdown Timer'), ), Container( height: 200, width: 200, child: SlideCountdown( key: _countdownKey, duration: _countdownDuration, style: const TextStyle(fontSize: 40), onDone: () { setState(() { // 更新Key强制组件重建,同时重置时长 _countdownKey = UniqueKey(); _countdownDuration = _initialDuration; }); }, ), ), ], ), ), ); } }
两种方案都能实现需求:初始加载时正常启动10秒倒计时,结束后自动重启,且初始状态不会触发重启逻辑。推荐使用方案一,控制器的方式更符合组件的设计规范,也更便于后续扩展其他控制逻辑。
内容的提问来源于stack exchange,提问作者Zoraiz Cobra
相关产品推荐
相关产品推荐

