Flutter 推另一页时,滑出另一页的最佳方式是什么?
这个问题在这里已经讨论了一些,但是没有一个解决方案是干净的,或者做一些奇怪的事情,比如显示同一页两次。 我试图使它成为这样,当你导航到下一页时,当前页会向左滑动,而下一页会从右侧进入。然而,我能想到的最好的解决方案是将当前页面的内容包装成幻灯片翻译。当您导航到下一页时,您将在“SlideRightRoute”动画中打开新页,同时启动动画以将当前页滑出 虽然这是可行的,但感觉上我是在“反对框架”。我的问题是:是否有一种“正确”的方式来制作页面动画,或者这是当前框架中的一个漏洞(而像这样的解决方案是目前我们能做的最好的解决方案)Flutter 推另一页时,滑出另一页的最佳方式是什么?,flutter,flutter-navigation,Flutter,Flutter Navigation,这个问题在这里已经讨论了一些,但是没有一个解决方案是干净的,或者做一些奇怪的事情,比如显示同一页两次。 我试图使它成为这样,当你导航到下一页时,当前页会向左滑动,而下一页会从右侧进入。然而,我能想到的最好的解决方案是将当前页面的内容包装成幻灯片翻译。当您导航到下一页时,您将在“SlideRightRoute”动画中打开新页,同时启动动画以将当前页滑出 虽然这是可行的,但感觉上我是在“反对框架”。我的问题是:是否有一种“正确”的方式来制作页面动画,或者这是当前框架中的一个漏洞(而像这样的解决方案
抽象类幻灯片页面
使用SingleTickerProviderStateMixin扩展状态{
动画控制器_控制器;
动画偏移;
@凌驾
void initState(){
super.initState();
_控制器=动画控制器(
vsync:这个,,
持续时间:持续时间(毫秒:500),
);
_偏移量=吐温(
开始:偏移量(0.0,0.0),
结束:偏移(-1.0,0.0),
).设置动画(_控制器);
}
@凌驾
小部件构建(构建上下文){
返回幻灯片转换(
位置:_偏移,
子:构建内容(上下文),
);
}
小部件buildContent(BuildContext);
未来推送(小部件页面)异步{
var result=Navigator.push(
上下文
新的SlideRightRoute(小部件:第页),
);
_controller.forward();
等待结果;
_controller.reverse();
}
}
类SlideRightRoute扩展PageRouteBuilder{
最终小部件;
SlideRightRoute({this.widget})
:超级(
转换持续时间:常量持续时间(毫秒:500),
pageBuilder:(构建上下文、动画、动画辅助动画){
返回控件;
},
transitionsBuilder:(构建上下文、动画、动画辅助动画、小部件子对象){
返回新的幻灯片转换(
职位:新吐温(
开始:常数偏移(1.0,0.0),
结束:偏移0.0,
).制作动画(动画),
孩子:孩子,
);
},
);
}
abstract class SlideablePage<T extends StatefulWidget>
extends State<T> with SingleTickerProviderStateMixin {
AnimationController _controller;
Animation<Offset> _offset;
@override
void initState() {
super.initState();
_controller = AnimationController(
vsync: this,
duration: Duration(milliseconds: 500),
);
_offset = Tween<Offset>(
begin: Offset(0.0, 0.0),
end: Offset(-1.0, 0.0),
).animate(_controller);
}
@override
Widget build(BuildContext context) {
return SlideTransition(
position: _offset,
child: buildContent(context),
);
}
Widget buildContent(BuildContext context);
Future push(Widget page) async {
var result = Navigator.push(
context,
new SlideRightRoute(widget: page),
);
_controller.forward();
await result;
_controller.reverse();
}
}
class SlideRightRoute extends PageRouteBuilder {
final Widget widget;
SlideRightRoute({this.widget})
: super(
transitionDuration: const Duration(milliseconds: 500),
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return widget;
},
transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
return new SlideTransition(
position: new Tween<Offset>(
begin: const Offset(1.0, 0.0),
end: Offset.zero,
).animate(animation),
child: child,
);
},
);
}