目标:按下一个按钮,使其切换到具有动画过渡的另一页。
为此,我正在使用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'),),],
);
});
}
}
该代码正常运行。实际上,它确实在两个页面之间切换,但是没有动画。
在开发过程中的某个时候,我正在获取动画,但是随后它停止了发生,我找不到原因。我不记得更改任何有关如何调用AnimatedSwitcher的内容。
如果有什么用,热重载也不再起作用。我需要重新启动应用程序才能进行任何更改注册。在开始使用AnimatedSwitcher之前,它通常可以正常工作。
答案 0 :(得分:11)
如果您要切换的新窗口小部件与先前窗口小部件的类型相同,请将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,
),
);
因为我们要在两个Container
之间进行切换,而AnimatedSwitcher
无法理解它们之间的区别,所以不会为它们的切换设置动画。
如果我们在这些key
中设置了不同的Container
属性,那么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,
),
);
答案 1 :(得分:0)
您可以尝试
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"),
],
);
}
}