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

使用setState()仍无法重启TweenAnimationBuilder动画求助

解决TweenAnimationBuilder调用setState后无法重启的问题

你的代码问题出在Tween的end值固定为1.0:当第一次动画结束后,_start被设为1,此时新的Tween是begin:1.0, end:1.0,两个值完全相同,动画自然不会执行。

方案1:双向循环动画(从0→1→0→1...)

只需调整Tween的end值,让每次动画的起止值交替产生差值:

class SocOptimiserProgressIndicator extends StatefulWidget {
  @override
  State<SocOptimiserProgressIndicator> createState() =>
      _SocOptimiserProgressIndicatorState();
}

class _SocOptimiserProgressIndicatorState
    extends State<SocOptimiserProgressIndicator> {
  double _start = 0;

  @override
  Widget build(BuildContext context) {
    final size = 40.0;
    return TweenAnimationBuilder<double>(
        // 修改end为1 - _start,让起止值交替变化
        tween: Tween(begin: _start, end: 1 - _start),
        duration: Duration(seconds: 4),
        onEnd: () => setState(() {
              _start = 1 - _start;
            }),
        builder: (context, value, child) {
          int percentage = (value * 100).ceil();
          // 保留你原有的UI构建逻辑
          return Center(child: Text('$percentage%'));
        });
  }
}

方案2:单向重复动画(每次都从0→1重启)

如果不需要反向动画,直接在onEnd里重置_start为0即可:

onEnd: () => setState(() {
  _start = 0;
}),

这样每次动画结束后,都会重新生成begin:0, end:1的Tween,触发新一轮动画。

内容的提问来源于stack exchange,提问作者Stéphane de Luca

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 03:30:46