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
相关产品推荐
相关产品推荐

