【问题标题】:Flutter Delayed Animation code Error : AnimationController.forward() called after AnimationController.dispose()Flutter 延迟动画代码错误:AnimationController.forward() 在 AnimationController.dispose() 之后调用
【发布时间】:2020-10-24 20:30:55
【问题描述】:

我在欢迎屏幕中实现了延迟动画,但在我的颤振应用程序中出现以下错误。让我知道我的代码中是否有错误,我可以更正并修复此问题。

错误是:

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()

这是我的代码:

class DelayedAnimation extends StatefulWidget {
  final Widget child;
  final int delay;
 
  DelayedAnimation({@required this.child, this.delay});

  @override
  _DelayedAnimationState createState() => _DelayedAnimationState();
}

class _DelayedAnimationState extends State<DelayedAnimation> with TickerProviderStateMixin {
  AnimationController _controller;
  Animation<Offset> _animOffset;

  @override
  void initState() {
    super.initState();

    _controller = AnimationController(
      vsync: this,
      duration: Duration(milliseconds: 800),
    );
    final curve = CurvedAnimation(
      curve: Curves.decelerate,
      parent: _controller,
    );
    _animOffset = Tween<Offset>(
      begin: const Offset(0.0, 0.35),
      end: Offset.zero,
    ).animate(curve);

    if (widget.delay == null) {
      _controller.forward();
    } else {
      Timer(Duration(milliseconds: widget.delay), () {
        _controller.forward();
      });
    }
  }

  @override
  void dispose() {
    super.dispose();
    _controller.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return FadeTransition(
      child: SlideTransition(
        position: _animOffset,
        child: widget.child,
      ),
      opacity: _controller,
    );
  }
}

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    当您使用TimerFuture.delayedAnimationController 交互时,通常会出现此问题。这就是问题。可以说delay = 1000

    以下代码告诉 Flutter,在 1000 毫秒内,在您的 DelayedAnimation 小部件中的动画控制器上调用 forward()

    Timer(Duration(milliseconds: widget.delay), () {
       _controller.forward();
    });
    

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

    这意味着当Timer执行时,它在一个已经被释放的控制器上调用forward()(因为DelayedAnimation已经被释放了)

    有几个解决方案。

    1. 在前转前检查mounted 属性:
    Timer(
      Duration(
        milliseconds: widget.delay
      ), 
      () {
        if(mounted) {
          _controller.forward();
        }
      }
    );
    

    或 2. 创建计时器时存储它:

    _timer = Timer(
      Duration(
        milliseconds: widget.delay
      ), 
      () {
        _controller.forward();
      }
    );
    

    然后在 dispose 时取消它:

    @override
      void dispose() {
        super.dispose();
        _controller.dispose();
        _timer?.cancel();
      }
    

    【讨论】:

    • 谢谢你,詹姆斯·艾伦。这有帮助。我的错误现在消失了。
    • @James,这些都是很好的解决方案。感谢您的回答。现在我知道如果它出现了如何处理这个错误。我不明白并且令人烦恼的是 - 为什么会首先发生这种情况,当进入下一个屏幕的时间(设置为 15 秒)显然比设置在 1100 毫秒左右的动画时间要长得多最大限度。我没有看到任何其他原因。您知道为什么会发生这种情况吗?
    【解决方案2】:

    您尚未提供有关您使用的Timer 的信息,因此无法评论您的代码中可能出现的问题。

    但我尝试使用Future.delayed 来延迟动画,对我来说效果很好。

    Future.delayed(Duration(milliseconds: widget.delay), () {
            _controller.forward();
          });
    

    希望对你有所帮助。

    编辑:

    '_ticker != null': AnimationController.forward() 调用后 AnimationController.dispose()

    错误显示,forward()dispose() 之后调用。这可能发生在您在延迟到期之前转到另一个屏幕并触发_controller.forward() 的情况下。转到另一个屏幕会导致_contoller.dispose(),因此在此之后调用_controller.forward() 会导致错误,因为_controller 已经被释放。例如,如果应用在 1 秒后进入下一个屏幕,而动画延迟为 2 秒,则可能会发生这种情况。

    【讨论】:

    • 你能给我你试过的完整代码吗?我仍然无法解决这个问题。
    • 我不认为分享完整的代码会有帮助。因为它是相同的代码,唯一的区别是我用 Future.delayed() 做的。您尝试使用 Future.delayed() 但它不起作用的事实意味着原因在其他地方。我将编辑答案并添加另一个要查找的内容,我认为这可能是问题所在。如果有帮助,请告诉我。
    • 我已经发布了实现页面,如果出现错误,请告诉我。
    • @Jyo 我尝试了完全相同的实现,它对我来说工作得很好。我什至看到了动画,大约 15 秒后(如代码中设置的那样),应用程序也毫无错误地转换到下​​一个屏幕。
    • 感谢您的帮助。但是由于某种有线原因,这个错误不会从我的代码中消失。我完全重写了代码,但错误还是一样。
    猜你喜欢
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    相关资源
    最近更新 更多