Animation 为什么即使在动画完成后对话框仍会多次打开?
onTap事件我添加了一个动画,并从“动画完成”调用了一个对话框,但问题是,当我第二次点击按钮并启动动画时,对话框会打开两次,当动画完成时&当我第三次点击时,对话框会打开三次,依此类推 代码: 变量:Animation 为什么即使在动画完成后对话框仍会多次打开?,animation,flutter,dart,Animation,Flutter,Dart,onTap事件我添加了一个动画,并从“动画完成”调用了一个对话框,但问题是,当我第二次点击按钮并启动动画时,对话框会打开两次,当动画完成时&当我第三次点击时,对话框会打开三次,依此类推 代码: 变量: double _angle = 0; double _current = 0; AnimationController _ctrl; Animation _ani; 从initState()方法初始化: 动画生成器: AnimatedBuilder( animation:
double _angle = 0;
double _current = 0;
AnimationController _ctrl;
Animation _ani;
从initState()方法初始化:
动画生成器:
AnimatedBuilder(
animation: _ani,
builder: (context, child) {
final _value = _ani.value;
this.valueee=_value ;
print("_value:$_value");
final _angle = _value * this._angle;
return center(
child:GestureDetector(
onTap : startAnimation,
//
//...
),
),
},
),
我从小部件树中的onTap:event调用它:
startAnimation(){
if (!_ctrl.isAnimating) {
var _random = Random().nextDouble();
_angle = 20 + Random().nextInt(5) + _random;
_ctrl.forward(from: 0.0).then((_) {
_current = (_current + _random);
_current = _current - _current ~/ 1;
_ctrl.reset();
//_ctrl.stop();
});
}
_ctrl.addStatusListener((status) {
if(status == AnimationStatus.completed) {
openDialogBox();
}
});
}
每次调用
startAnimation()
方法时,都将调用\u ctrl.addStatusListener
方法,然后将新的StatusListener添加到animationController
只需将\u ctrl.addStatusListener
移动到\u ani=CurvedAnimation(父项:\u ctrl,curve:Curves.fastlineartosloweasin)下方即可代码>
像这样:
var _duration = Duration(milliseconds: 5000);
_ctrl = AnimationController(vsync: this, duration: _duration);
_ani = CurvedAnimation(parent: _ctrl, curve: Curves.fastLinearToSlowEaseIn);
_ctrl.addStatusListener((status) {
if(status == AnimationStatus.completed) {
openDialogBox();
}
});
及
但是您将ctrl.addStatusListener()
放置在initState()
方法中。我想在动画完成时使用它。@Shruti Ramnandan Sharma为什么要在动画完成时使用它?它只是一个回调。您可以根据状态
参数判断它是否完成。例如,status==AnimationStatus.completed
因为我想在动画完成时调用一个对话框。@Shruti Ramnandan Sharma所以你可以根据AnimationStatus
状态判断它是否完成。
var _duration = Duration(milliseconds: 5000);
_ctrl = AnimationController(vsync: this, duration: _duration);
_ani = CurvedAnimation(parent: _ctrl, curve: Curves.fastLinearToSlowEaseIn);
_ctrl.addStatusListener((status) {
if(status == AnimationStatus.completed) {
openDialogBox();
}
});
startAnimation(){
if (!_ctrl.isAnimating) {
var _random = Random().nextDouble();
_angle = 20 + Random().nextInt(5) + _random;
_ctrl.forward(from: 0.0).then((_) {
_current = (_current + _random);
_current = _current - _current ~/ 1;
_ctrl.reset();
//_ctrl.stop();
});
}
}