Animation 如何从外部控制颤振中的动画?

Animation 如何从外部控制颤振中的动画?,animation,dart,flutter,Animation,Dart,Flutter,将状态传递给小部件很容易。我有一个StatefulWidget,它包含一个带有控制器的动画。我需要能够从我的小部件树中较高的另一个小部件触发动画 MyMainApp应使用按钮触发动画 据我所知,AnimationController只有一个命令式API。我可以调用controller.forward()或controller.reverse()。但要做到这一点,我需要将控制器公开给我的MainApp 我现在做的是保留我状态的全局变量 class MainApp extends Statele

将状态传递给小部件很容易。我有一个
StatefulWidget
,它包含一个带有控制器的动画。我需要能够从我的小部件树中较高的另一个小部件触发动画

My
MainApp
应使用按钮触发动画

据我所知,AnimationController只有一个命令式API。我可以调用
controller.forward()
controller.reverse()
。但要做到这一点,我需要将控制器公开给我的MainApp

我现在做的是保留我状态的全局变量

class MainApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      ...
      body: new LogoWidget(),
    );
  }

  _startAnimation() {
    _state.restartAnimation();
  }
}

_LogoWidgetState _state; // yuk!

class LogoWidget extends StatefulWidget {
  _LogoWidgetState createState() {
    _state = _LogoWidgetState();
    return _state;
  }
}

class _LogoWidgetState extends State<LogoWidget>
    with SingleTickerProviderStateMixin {
  Animation<double> animation;
  AnimationController controller;

  restartAnimation() {
    controller.value == 1.0 ? controller.reverse() : controller.forward();
  }
  ...
}
class MainApp扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
归还新脚手架(
...
正文:新LogoWidget(),
);
}
_startAnimation(){
_state.restartAnimation();
}
}
_LogoWidgetState _state;//大笑!
类LogoWidget扩展了StatefulWidget{
_LogoWidgetState createState(){
_状态=_LogoWidgetState();
返回状态;
}
}
类_LogoWidgetState扩展状态
使用SingleTickerProviderStateMixin{
动画;
动画控制器;
重新启动(){
controller.value==1.0?controller.reverse():controller.forward();
}
...
}
(完整源代码)


处理这个问题的更好方法是什么?

您不需要
\u logowigetstate\u state;//哎呀在无关紧要的中间,但你可以尝试:

  • 创建
    LogoWidget\u myBody=LogoWidget()
    ,并将其用于您的
    body:
  • 同样,使用
    final\u LogoWidgetState\u state=\u LogoWidgetState()
  • 然后将其称为
    \u myBody.\u state.restartAnimation()
  • 您的样本已修改:

    class MainApp extends StatelessWidget {
    
      LogoWidget _myBody = LogoWidget();  //<---
    
      @override
      Widget build(BuildContext context) {
        return new Scaffold(
          ...
          body: _myBody,  //<---
        );
      }
    
      _startAnimation() {
        _myBody._state.restartAnimation();  //<---
      }
    }
    
    class LogoWidget extends StatefulWidget {
    
      final _LogoWidgetState _state = _LogoWidgetState();  //<---
    
      _LogoWidgetState createState() {
        return _state;
      }
    }
    
    然后只需使用myBody.restaranimation()

    以下是一些相关帖子:


    为什么
    LogoWidget
    会在其他地方控制动画内容?嗯……动画小部件本身应该只对应用程序状态做出反应……否则我必须拉出
    AnimationController
    ,但
    MainApp
    根本不应该关心这个问题。
    class LogoWidget extends StatefulWidget {
    
      final _LogoWidgetState _state = _LogoWidgetState();  //<---
    
      void restartAnimation() {  //<---
        _state.restartAnimation();
      }
    
      _LogoWidgetState createState() {
        return _state;
      }
    }