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

Flutter动画运行时跳转页面报AnimationController调用dispose后使用错误如何解决?

问题根因
  • 你注册的10秒后执行动画重置停止的异步延迟任务没有和页面生命周期绑定,页面销毁时没有取消该任务,导致任务到期后依然会调用已经被dispose的AnimationController的方法,触发报错。
  • AnimationController的相关监听器/动画回调没有在页面销毁前移除,导致回调持续执行,所以stoppingAnimation方法里的打印会持续输出。
修复方案

步骤1:用可取消的Timer存储延迟任务

不要用无引用的Future.delayed实现10秒延迟,改用可手动取消的Timer,在页面对应的State类中定义变量:

Timer? _autoStopTimer;
AnimationController? _rotationAnimationController;

步骤2:延迟回调增加页面挂载状态判断

启动动画的逻辑增加兜底判断,只有页面还处于挂载状态时才操作动画控制器:

void startMatchAnimation() {
  // 启动旋转动画的原有逻辑
  _rotationAnimationController?.repeat();
  // 注册自动停止的延迟任务
  _autoStopTimer = Timer(const Duration(seconds: 10), () {
    // 仅页面未销毁时执行动画操作
    if (mounted) {
      _rotationAnimationController?.reset();
      _rotationAnimationController?.stop();
      // 其他匹配超时后的业务逻辑
    }
  });
}

步骤3:在dispose生命周期统一销毁资源

重写State的dispose方法,按顺序销毁所有关联资源,避免内存泄漏和非法调用:

@override
void dispose() {
  // 先取消延迟任务,阻止后续回调执行
  _autoStopTimer?.cancel();
  // 如果你给动画添加了自定义Listener/StatusListener,要在这里对应移除
  // 销毁动画控制器
  _rotationAnimationController?.dispose();
  super.dispose();
}
额外优化

所有调用AnimationController方法的业务位置,都可以加mounted判断做兜底,避免页面销毁后触发非法调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 19:54:05