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

Flutter中TweenAnimationBuilder动画播放过快问题及解决方案

解决Flutter中TweenAnimationBuilder动画播放过快的异常问题

我之前也碰到过类似的动画节奏异常问题,看了你的代码后,很快定位到了问题根源:

问题本质

你的TimePiePainter类里的shouldRepaint方法始终返回true,这会导致CustomPaint在每一帧都强制触发重绘——哪怕动画的进度值(value)根本没有变化。这种不必要的频繁重绘会干扰TweenAnimationBuilder的正常动画调度逻辑,让系统误以为需要加速渲染,最终导致动画时长被大幅压缩,出现「5秒动画瞬间结束、5分钟动画仅10秒完成」的异常。

而且TweenAnimationBuilder本身就会在动画的每一帧自动触发builder回调,传递更新后的value,完全不需要shouldRepaint一直返回true来强制重绘。

修复方案

只需要修改shouldRepaint方法,让它只在新旧value发生变化时才返回true,避免无意义的重绘:

class TimePiePainter extends CustomPainter { 
  final double value; 
  TimePiePainter(this.value); 
  @override 
  void paint(Canvas canvas, Size size) { 
    Paint _paint = Paint() 
      ..color = Color.lerp(Colors.green, Colors.redAccent, value > 0.6 ? value * 1.5 : value)! 
      ..style = PaintingStyle.fill; 
    canvas.drawArc( 
      Rect.fromLTWH(0, 0, size.width, size.height), 
      -pi / 2, 
      pi * 2 - pi * 2 * value, 
      true, 
      _paint, 
    ); 
  } 
  @override 
  bool shouldRepaint(covariant TimePiePainter oldDelegate) { 
    // 仅当value变化时才触发重绘
    return oldDelegate.value != this.value; 
  } 
}

额外提示

注意到你写了getRadiansFromTotalTime方法,但当前代码里并没有调用它。如果这是你原本用来计算倒计时进度的逻辑,可以考虑把它整合到Tween的设置或者builder回调中,让动画逻辑更连贯清晰。

修改完成后,TweenAnimationBuilder就能严格按照你设置的Duration来正常播放动画了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 23:23:13