我已经为Flutter构建了自定义PageRouteBuilder
,因为我需要进行这样的转换:
两个屏幕同时滑动。
我设法通过以下方式做到这一点:
class SlideLeftRoute extends PageRouteBuilder {
final Widget widget;
final Widget prevWidget;
SlideLeftRoute({this.widget, this.prevWidget})
: super(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return widget;
},
transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
List<Widget> stackWidgets = new List<Widget>();
if (prevWidget != null) {
stackWidgets.add(Positioned(
child: SlideTransition(
position: new Tween<Offset>(
begin: const Offset(0.0, 0.0),
end: const Offset(1.0, 0.0),
).animate(animation),
child: prevWidget)));
}
stackWidgets.add(Positioned(
child: SlideTransition(
position: new Tween<Offset>(
begin: const Offset(-1.0, 0.0),
end: const Offset(0.0, 0.0),
).animate(animation),
child: child)));
return Stack(
children: stackWidgets,
);
}
);
}
从视觉上看,它的工作原理是
。从功能上讲,它具有一些意外的行为:
当我使用此构建器进行导航时,将调用上一个窗口小部件的initState
。
假设我在Screen1
中,然后导航到Screen2
,向Navigator
提供此构建器。
根据指定的Screen1
,我的Screen2
滑出而SlideTransition
滑入。
这样做的同时,initState
被Screen1
调用。
现在,我希望initState
被称为Screen2
,因为我正在构建它并将其推送到我的导航中。但是,为什么Screen1
呢?
有什么办法可以避免吗?
谢谢!