#flutter
#flutter
Вопрос:
В моем проекте Flutter, который имеет несколько экранов, я хочу создать один экран с 2 кнопками:
- первая кнопка закрывает текущий экран
Navigator.pop()
с переходом, при котором текущий экран исчезает справа - вторая кнопка также закрывает текущий экран
Navigator.pop()
, но на этот раз экран исчезает в нижней части
Каждый пример, который я нашел до сих пор, позволяет мне устанавливать только один возможный переход, когда я открываю свой экран.
Кроме того, я использую именованные маршруты для навигации в своем приложении.
Как я могу настроить анимацию всплывающих окон в соответствии с кнопкой, нажатой пользователем?
Спасибо.
Комментарии:
1. Вы можете использовать
pageRouteBuilder
для пользовательских анимаций навигации. Посмотрите эту статью и это видео .2. Я уже все это проверил, и, к сожалению, это не отвечает на мой вопрос: как выбрать 2 разных анимации перехода в
Navigator.pop()
зависимости от нажатой кнопки?3. вы должны использовать пользовательский
Navigator
интерфейс с пользовательскимTransitionDelegate
интерфейсом, который может принимать параметры при всплывающем окне и решать, какой переход использовать
Ответ №1:
что бы вы ни определили как анимацию маршрута, оно будет обратным и будет использоваться как всплывающая навигация.
в вашем случае вы можете использовать разные анимации для нажатия каждой из них.
вы можете создать свою собственную анимацию и определить анимацию и использовать ее вместо material page router
import 'package:flutter/material.dart';
class MyCustomRoute extends PageRouteBuilder {
final Widget widget;
MyCustomRoute({this.widget})
: super(
pageBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation) {
return widget;
},
transitionsBuilder: (BuildContext context, Animation<double> animation, Animation<double> secondaryAnimation, Widget child) {
return new ScaleTransition(
scale: new Tween<double>(
begin: 0.0,
end: 1.0,
).animate(
CurvedAnimation(
parent: animation,
curve: Interval(
0.00,
0.50,
curve: Curves.bounceIn,
),
),
),
child: ScaleTransition(
scale: Tween<double>(
begin: 1.5,
end: 1.0,
).animate(
CurvedAnimation(
parent: animation,
curve: Interval(
0.50,
1.00,
curve: Curves.easeIn,
),
),
),
child: child,
),
);
}
);
}
для реализации
onPressed: () {
Navigator.push(context,
new MyCustomRoute (widget: Secondpage()));
},
для pop
onPressed: () {
Navigator.pop();// will reverse the animation
},
Комментарии:
1. Спасибо, но это не отвечает на мой вопрос: что, если у меня на экране есть 2 кнопки, и каждая из них устанавливает пользовательскую (и разную!) Анимацию перехода, когда я открываю экран?
2. о, вы можете использовать
push
вместоpop
и использовать разные `анимации перехода` для каждого из них, при каждом нажатии вы можете вернуться на предыдущую страницу ,3. также, если вы не хотите возвращаться туда, где существуют кнопки, вы можете использовать
PushAndRemoveUntil
вместоpush
этогоNavigator.pushAndRemoveUntil(context,MyCustomRoute ( widget:SeconPage()),(Route<dynamic> route) => false, );
4. О, хорошо, я этого не знал, я попробую это очень скоро. Спасибо! Но еще один вопрос: если я использую
push()
вместоpop()
, чтобы вернуться на предыдущую страницу, будет ли у меня тогда другой экземпляр этой страницы?5. да, но вы можете использовать
pushReplacement
, он заменяет текущий маршрут навигатора, нажимая на данный маршрут, а затем удаляя предыдущий маршрут, как только новый маршрут закончил анимацию. вроде какpushandremoveuntil
, попробуйте это и сообщите мне результат, я рад помочь