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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:15:22