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

Flutter中TweenAnimationBuilder结束后重置并重启动画问题

解决TweenAnimationBuilder倒计时无法重置的问题

问题核心是TweenAnimationBuilder的动画执行完成后不会自动重启,单纯调用setState()不会触发组件重建,自然没法重新启动倒计时。解决思路是给组件添加一个动态更新的key,让Flutter在需要重置时重新创建这个组件,从而重启动画。

步骤1:添加动态Key变量

在你的State类中声明一个用于控制组件重建的Key:

Key _timerKey = UniqueKey();

步骤2:给TweenAnimationBuilder绑定Key

修改你的TweenAnimationBuilder,添加key属性:

TweenAnimationBuilder(
  key: _timerKey, // 新增这行
  tween: Tween(begin: 90.0, end: 0.0),
  duration: Duration(seconds: 90),
  builder: (context, value, child) {
    num val = value;
    num time = val.toInt();
    return Stack(
      alignment: Alignment.center,
      children: [
        normalText(
          text: "$time",
          size: 25,
          color: color__orange),
        SizedBox(
          width: 60,
          height: 60,
          child: CircularProgressIndicator(
            value: time / 90,
            valueColor: const AlwaysStoppedAnimation(color__orange),
          ),
        ),
      ],
    );
  },
  onEnd: (){
    var questionID = snapshot.data!.quizzesData!.first.questionID;
    QuizQuestion(questionID);
    // 更新Key触发组件重建,重启倒计时
    setState(() => _timerKey = UniqueKey());
  },
),

步骤3:提交按钮中同步更新Key

在提交按钮的onPressed逻辑里,完成提交操作后同样更新Key:

ElevatedButton(
  style: ElevatedButton.styleFrom(backgroundColor: color__orange),
  onPressed: (){
    if (selectedOptionStatus == 'True') {
      var questionID = snapshot.data!.quizzesData!.first.questionID;
      var score = snapshot.data!.quizzesData!.first.question!.first.marks;
      var answerID = snapshot.data!.quizzesData!.first.question!.first.answer![index].answerID;
      QuizQuestion(questionID);
      StudentQuestionAnswer(questionID, score, answerID);
      currentQuestionIndex++;

      if ( (currentQuestionIndex + 1) == int.parse(widget.totalQuestions)) {
        updateStudentQuizLoginHistoryFinish();
      }
      // 更新Key重启倒计时
      setState(() => _timerKey = UniqueKey());
    }
    else {
      if (selectedOptionStatus == 'False') {
        var questionID = snapshot.data!.quizzesData!.first.questionID;
        var score = '0';
        var answerID = snapshot.data!.quizzesData!.first.question!.first.answer![index].answerID;

        QuizQuestion(questionID);
        StudentQuestionAnswer(questionID, score, answerID);
        currentQuestionIndex++;

        if (currentQuestionIndex + 1 == int.parse(widget.totalQuestions)) {
          StudentQuiz();
        }
        // 更新Key重启倒计时
        setState(() => _timerKey = UniqueKey());
      }
    }
  },
  child: const Text('Save Answer')
)

原理说明

Flutter会根据key来识别组件身份,当key变化时,Flutter会认为这是一个新组件,会销毁旧的TweenAnimationBuilder并创建新的实例,新实例会自动启动从90到0的倒计时动画,完美解决重置问题。

内容的提问来源于stack exchange,提问作者Tahir

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 13:20:50