gpt4 book ai didi

animation - 如何从外部控制 Flutter 中的动画?

转载 作者:行者123 更新时间:2023-12-02 23:31:59 26 4
gpt4 key购买 nike

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

app

我的 MainApp 应该使用按钮触发动画。

enter image description here

据我了解 AnimationController 仅具有命令式 API。我可以调用 controller.forward()controller.reverse()。但要做到这一点,我需要将 Controller 公开给我的 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 )

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

最佳答案

您不需要_LogoWidgetState _state;//yuk! 在一个偏僻的地方,但你可以尝试:

  1. 创建LogoWidget _myBody = LogoWidget(),并将其用于您的正文:
  2. 同样,应用final _LogoWidgetState _state = _LogoWidgetState()
  3. 然后将其称为 _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()

以下是一些相关帖子:

关于animation - 如何从外部控制 Flutter 中的动画?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50293963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com