我已经在我的欢迎屏幕上实现了一个延迟的动画,但是在我的颤振应用程序中我得到了下面的错误。如果我的代码中有错误,我可以纠正并修复这个问题,请告诉我。
错误是:
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,
);
}
}发布于 2020-07-13 09:14:09
当您使用Timer或Future.delayed与AnimationController交互时,经常会出现此问题。这就是问题所在。让我们说,delay = 1000。
下面的代码告诉flutter,在1000毫秒内,在您的forward()小部件中的动画控制器上调用DelayedAnimation
Timer(Duration(milliseconds: widget.delay), () {
_controller.forward();
});然而,在此之前,您的DelayedAnimation小部件将被释放(例如,如果用户移动到另一个屏幕,就会发生这种情况)。
这意味着当Timer执行时,它在已释放的控制器上调用forward() (因为DelayedAnimation已被释放)。
有几个解决办法。
mounted属性:Timer(
Duration(
milliseconds: widget.delay
),
() {
if(mounted) {
_controller.forward();
}
}
);或者2.在创建计时器时存储它:
_timer = Timer(
Duration(
milliseconds: widget.delay
),
() {
_controller.forward();
}
);然后在处分时取消它:
@override
void dispose() {
super.dispose();
_controller.dispose();
_timer?.cancel();
}发布于 2020-07-04 08:38:00
您没有提供您使用过的Timer的信息,因此不能评论您的代码中可能出错的地方。
但是我试着用Future.delayed来延迟动画,它对我来说很好。
Future.delayed(Duration(milliseconds: widget.delay), () {
_controller.forward();
});希望这能帮到你。
编辑:
'_ticker != null':在AnimationController.dispose()之后调用AnimationController.forward()
错误说,forward()在dispose()之后调用。这种情况可能发生在延迟到期并触发_controller.forward()之前,您将转到另一个屏幕。转到另一个屏幕会导致_contoller.dispose(),因此在此之后调用_controller.forward()会导致错误,因为_controller已经被释放。例如,如果应用程序在1秒后进入下一个屏幕,而动画延迟为2秒,则可能会发生这种情况。
https://stackoverflow.com/questions/62726872
复制相似问题