#flutter #flutter-animation
#трепетание #flutter-анимация
Вопрос:
Я пытаюсь создать плавный переход для push-маршрутов, для этого создан пользовательский маршрут, подобный
class CustomPageRoute<T> extends MaterialPageRoute<T> {
CustomPageRoute({WidgetBuilder builder, RouteSettings settings})
: super(builder: builder, settings: settings);
@override
Widget buildTransitions(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation, Widget child) {
return FadeTransition(opacity:animation, child: child, );
}
}
И вызывая его с помощью кнопки, нажмите, как
onPressed: () {
Navigator.push(context, CustomPageRoute(builder: (context) {
return FirstScreen();
}));
}
Но это дает странную анимацию со скольжением исчезновение.
Как избежать анимации скольжения в этом?
Вот результат моего кода:
Ответ №1:
Вы должны расширяться с PageRoute
вместо MaterialPageRoute
class CustomPageRoute<T> extends PageRoute<T> {
CustomPageRoute(this.child);
@override
// TODO: implement barrierColor
Color get barrierColor => Colors.black;
@override
String get barrierLabel => null;
final Widget child;
@override
Widget buildPage(BuildContext context, Animation<double> animation,
Animation<double> secondaryAnimation) {
return FadeTransition(
opacity: animation,
child: child,
);
}
@override
bool get maintainState => true;
@override
Duration get transitionDuration => Duration(milliseconds: 500);
}
Использование:
final page = YourNewPage();
Navigator.of(context).push(CustomPageRoute(page));
Комментарии:
1. Хм. Я вообще не вижу анимации. Не знаю, почему это очень простой пример.
2. @JoKr Сначала я поддержал ваш комментарий, но обнаружил, что у меня это не работает, потому что у меня был переход на пустую страницу. Мне нужно было добавить
Scaffold
, чтобы это заработало3. Woahhh Diegooooooooooooooooooooooooooooooooooooooooooooooooooo, я только что закончил копировать этот код, тогда я понял, что это ты…. diegoveloper..мой любимый флаттер разработчиков.
4. спасибо, это проще, чем использовать PageRouteBuilder
Ответ №2:
Просто создайте метод, который возвращает Route
. В качестве параметра передайте новый экранный виджет
Route createRoute(Widget page) {
return PageRouteBuilder(
pageBuilder: (context, animation, secondaryAnimation) => page,
transitionsBuilder: (context, animation, secondaryAnimation, child) {
return FadeTransition(
opacity: animation,
child: child,
);
},
);
}
Для вызова маршрута вы должны использовать
Navigator.push(
context,
createRoute(
AnotherScreen(),
),
);
Давайте наслаждаться 🚀