将状态传递给小部件很容易。我有一个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();
}
...
}
(完整源代码here)
有什么更好的方法可以解决这个问题?
答案 0 :(得分:1)
您不需要_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;
}
}
但是,如果您认为_myBody._state.restartAnimation()
太长,可以使用以下方法将其缩短:
class LogoWidget extends StatefulWidget {
final _LogoWidgetState _state = _LogoWidgetState(); //<---
void restartAnimation() { //<---
_state.restartAnimation();
}
_LogoWidgetState createState() {
return _state;
}
}
然后只使用_myBody.restartAnimation()
以下是一些相关的帖子: