oli*_*ver 5 animation dart flutter
将状态传递给小部件很容易。我有一个StatefulWidget
包含动画及其控制器的动画。我需要能够从小部件树中更高的另一个小部件触发动画。
我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();
}
...
}
Run Code Online (Sandbox Code Playgroud)
(完整源代码在这里)
有什么更好的方法来处理这个问题?
您不需要_LogoWidgetState _state; // yuk!
到偏僻的地方,但您可以尝试:
LogoWidget _myBody = LogoWidget()
,并将其用于您的body:
final _LogoWidgetState _state = _LogoWidgetState()
_myBody._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;
}
}
Run Code Online (Sandbox Code Playgroud)
但如果你认为_myBody._state.restartAnimation()
太长,你可以用以下方法缩短它:
class LogoWidget extends StatefulWidget {
final _LogoWidgetState _state = _LogoWidgetState(); //<---
void restartAnimation() { //<---
_state.restartAnimation();
}
_LogoWidgetState createState() {
return _state;
}
}
Run Code Online (Sandbox Code Playgroud)
然后只需使用_myBody.restartAnimation()
以下是一些相关帖子: