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