Я создал пользовательский PageRouteBuilder
для Flutter, так как мне нужен был переход, который делает что-то вроде этого:
- Новый экран скользит в
- Текущий экран (старый экран) скользит out
Оба экрана скользят одновременно.
Мне удалось сделать это следующим образом:
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
s.
При этом initState
вызывается в Screen1
.
Теперь я ожидаю, что initState
вызовут для Screen2
, так как я собираю его и нажимаюэто на мою навигацию.Но почему это для Screen1
?
Можно ли как-нибудь избежать этого?
Спасибо!