AnimatedSwitcher 没有按预期工作?小部件改变但没有动画

pou*_*ews 12 flutter flutter-layout flutter-animation

目标:按下一个按钮,让它切换到另一个带有动画过渡的页面。

为此,我正在使用 AnimatedSwitcher。

下面是我的代码:

class WelcomeScreenSwitcher extends State<RandomWords>{
  Widget calledWidget;

  void switchPage(int newNumber, context) {
    if (newNumber == 1) {
      setState(() {calledWidget = welcomeScreen(context);},);
    } else if (newNumber == 2) {
      setState(() {calledWidget = learnMoreScreen(context);},);}
    }

  @override
  Widget build(BuildContext context) {
    if (calledWidget == null) {
      switchPage(1, context);
    }
    return AnimatedSwitcher(
      duration: Duration(milliseconds: 5000),
      child: calledWidget,
    );

  Widget welcomeScreen(context){
    return Scaffold({body: Column(children: [
      RaisedButton(onPressed: () {switchPage(2, context);}, child: Text('B'),),],
        );
      });
    }

  Widget learnMoreScreen(context){
    return Scaffold({body: Column(children: [
      RaisedButton(onPressed: () {switchPage(2, context);}, child: Text('B'),),],
        );
      });
    }
  }
Run Code Online (Sandbox Code Playgroud)

该代码是功能性的。它实际上会在两个页面之间切换,但没有动画与之相配。

在开发过程中的某个时候,我得到了动画,但后来它就停止了,我不知道为什么。我不记得改变任何关于我如何调用 AnimatedSwitcher 的具体内容。

如果它有任何用处,热重载也不再起作用。我需要重新启动应用程序才能进行任何更改注册。在开始处理 AnimatedSwitcher 之前,它曾经正常运行。

Ami*_*khi 37

如果您要切换的新小部件与以前的小部件类型相同,请将key属性设置为另一个值以获取该动画

例如,这AnimatedSwitcher不起作用:

  AnimatedSwitcher(
    duration: const Duration(milliseconds: 1000),
    child: (condition)
        ? Container(
            width: 100,
            height: 100,
            color: Colors.red,
          )
        : Container(
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
  );
Run Code Online (Sandbox Code Playgroud)

因为我们要在两个Containers之间切换,AnimatedSwitcher无法理解它们的区别,所以没有动画它们的切换。如果我们key在那些Containers 中设置不同的属性,那么AnimatedSwitcher可以理解它们是不同的并且确实为它们的开关设置动画。

像这样:

  AnimatedSwitcher(
    duration: const Duration(milliseconds: 1000),
    child: (condition)
        ? Container(
            key: ValueKey<int>(0),
            width: 100,
            height: 100,
            color: Colors.red,
          )
        : Container(
            key: ValueKey<int>(1),
            width: 100,
            height: 100,
            color: Colors.blue,
          ),
  );
Run Code Online (Sandbox Code Playgroud)

  • 就为了这个浪费了几个小时,谢谢!但你怎么知道这一点? (2认同)

key*_*key 4

你可以试试这个

class _AniSwitchState extends State<AniSwitch> {
  Widget calledWidget;

  @override
  Widget build(BuildContext context) {
    void switchPage(int newNumber) {
      if (newNumber == 1) {
        setState(() {calledWidget = WelcomeScreen();},);
      } else if (newNumber == 2) {
        setState(() {calledWidget = LearnMoreScreen();},);}
    }

      if (calledWidget == null) {
        switchPage(1);
      }

    return Column(
      children: <Widget>[
        AnimatedSwitcher(
          duration: Duration(milliseconds: 2000),
          child: calledWidget
        ),
        RaisedButton(
          child: const Text('Increment'),
          onPressed: () {
            setState(() {
              switchPage(2);
            });
          },
        ),
      ],
    );
  }
}

class WelcomeScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text("Welcome"),
      ],
    );
  }
}

class LearnMoreScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Column(
      children: <Widget>[
        Text("hello world"),
      ],
    );
  }
}
Run Code Online (Sandbox Code Playgroud)