#flutter
#flutter
Вопрос:
На произвольной глубине в приложении my Flutter пользователь может выйти из приложения, нажав на кнопку. Как я могу заменить текущий стек экранов экраном авторизации / входа в систему и создать «красивую» анимацию для перехода?
В настоящее время я делаю следующее, но анимация совсем не красивая. В iOS экраны в стеке выдвигаются вправо, а экран авторизации перемещается справа. Слишком сильное скольжение.
NavigatorState navigatorState = Navigator.of(this.context);
while (navigatorState.canPop()) {
navigatorState.pop();
}
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (BuildContext context) {
return AuthScreen();
}),
);
Я бы предпочел, чтобы экран авторизации скользил снизу вверх на iOS, а на Android экран авторизации отображался с обычной анимацией. Затем удалите все экраны, расположенные ниже в стеке. Я не могу найти способ манипулировать стеком таким образом во Flutter.
Ответ №1:
попробуйте это.
Navigator.pushAndRemoveUntil(
context,
PageRouteBuilder(pageBuilder: (BuildContext context, Animation animation,
Animation secondaryAnimation) {
return AuthScreen();
}, 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,
);
}),
(Route route) => false);
Здесь pushAndRemoveUntil
очистится стек и появится новый экран.
PageRouteBuilder
Позволяет анимировать переходы на экране. Вы можете поиграть с ним, вернувшись FadeTransition
или любым другим, который вам больше нравится. Таким образом, вы можете добиться анимированного перехода.
Ответ №2:
Если вы объявляете маршруты в своем MaterialApp подобным образом.
MaterialApp(
home: new Screen1(),
routes: <String, WidgetBuilder> {
'/AuthScreen': (BuildContext context) => new AuthScreen()
},
)
Вы можете использовать
Navigator.of(context).pushNamedAndRemoveUntil('/AuthScreen', (Route<dynamic> route) => false);
Комментарии:
1. хороший ответ! не могли бы вы также, пожалуйста, объяснить, для чего нужен этот аргумент? (Маршрут<динамический> маршрут) => false