Flutter 延迟动画代码错误:在 AnimationController.dispose() 之后调用 AnimationController.forward()

Jyo*_*Jyo 3 dart flutter

我在欢迎屏幕中实现了延迟动画,但在我的 flutter 应用程序中出现以下错误。如果我的代码中有错误,请告诉我,我可以纠正并解决此问题。

错误是:

E/flutter (11565): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)]
Unhandled Exception:
'package:flutter/src/animation/animation_controller.dart': Failed
assertion: line 455 pos 7: '_ticker != null':
AnimationController.forward() called after
AnimationController.dispose()
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

E/flutter (11565): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)]
Unhandled Exception:
'package:flutter/src/animation/animation_controller.dart': Failed
assertion: line 455 pos 7: '_ticker != null':
AnimationController.forward() called after
AnimationController.dispose()
Run Code Online (Sandbox Code Playgroud)

Jam*_*len 9

当您使用TimerFuture.delayedAnimationController. 这就是问题。可以这么说delay = 1000

下面的代码告诉 flutter,在 1000 毫秒内,调用forward()你的DelayedAnimation小部件中的动画控制器

Timer(Duration(milliseconds: widget.delay), () {
   _controller.forward();
});
Run Code Online (Sandbox Code Playgroud)

但是,在此之前,您的DelayedAnimation小部件已被释放(例如,如果用户移动到不同的屏幕,则会发生这种情况)

这意味着当Timer执行时,它正在调用forward()一个已被处理的控制器(因为DelayedAnimation已被处理)

有几种解决方案。

  1. mounted在调用前检查属性:
Timer(
  Duration(
    milliseconds: widget.delay
  ), 
  () {
    if(mounted) {
      _controller.forward();
    }
  }
);
Run Code Online (Sandbox Code Playgroud)

或 2. 创建 Timer 时存储它:

_timer = Timer(
  Duration(
    milliseconds: widget.delay
  ), 
  () {
    _controller.forward();
  }
);
Run Code Online (Sandbox Code Playgroud)

然后在处置时取消它:

@override
  void dispose() {
    super.dispose();
    _controller.dispose();
    _timer?.cancel();
  }
Run Code Online (Sandbox Code Playgroud)