Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Animation 为什么即使在动画完成后对话框仍会多次打开?_Animation_Flutter_Dart - Fatal编程技术网

Animation 为什么即使在动画完成后对话框仍会多次打开?

Animation 为什么即使在动画完成后对话框仍会多次打开?,animation,flutter,dart,Animation,Flutter,Dart,onTap事件我添加了一个动画,并从“动画完成”调用了一个对话框,但问题是,当我第二次点击按钮并启动动画时,对话框会打开两次,当动画完成时&当我第三次点击时,对话框会打开三次,依此类推 代码: 变量: double _angle = 0; double _current = 0; AnimationController _ctrl; Animation _ani; 从initState()方法初始化: 动画生成器: AnimatedBuilder( animation:

onTap事件我添加了一个动画,并从“动画完成”调用了一个对话框,但问题是,当我第二次点击按钮并启动动画时,对话框会打开两次,当动画完成时&当我第三次点击时,对话框会打开三次,依此类推

代码:

变量:

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