这个问题已经在这里讨论了一点,但是没有一个解决方案是干净的,或者做奇怪的事情,比如两次显示同一个页面。 Flutter 过渡出口
我正在努力做到这一点,因此当您导航到下一页时,当前页面向左滑动,而下一页从右侧进入。但是,我能想出的最佳解决方案是将当前页面的内容包装在 SlideTransition 中。当您导航到下一页时,您开始在“SlideRightRoute”动画中打开新页面,同时您开始制作动画以将当前页面滑出。
虽然这行得通,但感觉就像我在“反对框架工作”。我的问题是:是否有一种“正确”的方式来为页面设置动画,或者这目前是框架中的一个漏洞(这样的解决方案确实是我们目前能做的最好的解决方案)?
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,
);
},
);
}