Как я могу использовать SlideTransition (или другую анимацию) в ShellRoute во Flutter?Android

Форум для тех, кто программирует под Android
Ответить
Гость
 Как я могу использовать SlideTransition (или другую анимацию) в ShellRoute во Flutter?

Сообщение Гость »


Я использую ShellRoute в go_router 13.0.0 и BottomNavigationBar для реализации вложенного маршрута. Однако я заметил, что анимация перехода при маршрутизации экрана неестественна. Итак, я попытался изменить анимацию маршрутизации в ShellRoute, но не смог. Мне также удалось найти человека, у которого были такие же проблемы, как и у меня.

проблема с GitHub

А это мой код.

routes.dart

import 'package:baro_project/screens/calendar_screen.dart'; импортировать «пакет: baro_project/screens/info_screen.dart»; импортировать «пакет: baro_project/screens/youtube_screen.dart»; импортировать «пакет: baro_project/widgets/nav_bar.dart»; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: go_router/go_router.dart»; импортировать «экраны/login_screen.dart»; импортировать «экраны/main_screen.dart»; импортировать «экраны/noti_screen.dart»; окончательный GlobalKey _rootNavigatorKey = GlobalKey(debugLabel: 'Root'); окончательный GlobalKey _shellNavigatorKey = GlobalKey(debugLabel: 'Shell'); конечный маршрутизатор = GoRouter(navigatorKey: _rootNavigatorKey, InitialLocation: '/login', маршруты: [ GoRoute( путь: '/логин', строитель: (контекст, состояние) => const Login(), ), GoRoute( путь: '/уведомление', строитель: (контекст, состояние) => const NotificationManager(), ), ShellRoute( navigatorKey: _shellNavigatorKey, строитель: (контекст, состояние, дочерний элемент) => NavBarWidget(дочерний: дочерний), маршруты: [ GoRoute( путь: '/main', строитель: (контекст, состояние) => const MainScreen(), ), GoRoute( путь: '/календарь', строитель: (контекст, состояние) => const CalendarScreen(), ), GoRoute( путь: '/youtube', строитель: (контекст, состояние) => const YoutubeScreen(), ), GoRoute( путь: '/информация', строитель: (контекст, состояние) => const InformationScreen(), ), ], ), ]); nav_bar.dart

import 'package:baro_project/widgets/app_bar.dart'; импортировать «пакет: baro_project/widgets/custom_drawer.dart»; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет:font_awesome_flutter/font_awesome_flutter.dart»; импортировать «пакет: go_router/go_router.dart»; класс NavBarWidget расширяет StatelessWidget { const NavBarWidget({super.key, требуется this.child}); последний дочерний виджет; @переопределить Сборка виджета (контекст BuildContext) { вернуть эшафот( appBar: customAppBar (контекст), тело: ребенок, BottomNavigationBar: BottomNavigationBar( unselectedItemColor: Colors.grey, selectedItemColor: Colors.black, тип: BottomNavigationBarType.fixed, элементы: const [ BottomNavigationBarItem( значок: FaIcon (FontAwesomeIcons.house, размер: 15,0), метка: «Основная», ), BottomNavigationBarItem( значок: FaIcon (FontAwesomeIcons.calendar, размер: 15,0), ярлык: «Календарь», ), BottomNavigationBarItem( значок: FaIcon (FontAwesomeIcons.youtube, размер: 15,0), ярлык: «Ютуб», ), BottomNavigationBarItem( значок: FaIcon (FontAwesomeIcons.user, размер: 15,0), ярлык: «Информация», ), ], onTap: (индекс) => _onItemTapped(индекс, контекст), currentIndex: _calculateIndex(контекст), ), endDrawer: customDrawer (контекст), ); } void _onItemTapped (индекс int, контекст BuildContext) { переключатель (индекс) { случай 0: GoRouter.of(context).go('/main'); перерыв; Дело 1: GoRouter.of(context).go('/calendar'); перерыв; случай 2: GoRouter.of(context).go('/youtube'); перерыв; случай 3: GoRouter.of(context).go('/информация'); перерыв; } } int _calculateIndex (контекст BuildContext) { окончательное currentLocation = GoRouterState.of(context).uri.toString(); если (currentLocation == '/main') { вернуть 0; } если (currentLocation == '/calendar') { возврат 1; } если (currentLocation == '/youtube') { возврат 2; } если (currentLocation == '/информация') { возврат 3; } вернуть 0; } } Я пробовал так.

ShellRoute( navigatorKey: _shellNavigatorKey, строитель: (контекст, состояние, дочерний элемент) { вар анимация = ModalRoute.of(контекст)?.animation; если (анимация == ноль) { вернуть NavBarWidget(дочерний: дочерний); } вернуть слайдпереход( позиция: Tween( начало: константное смещение (0, 1), конец: Смещение.ноль, .animate(анимация), дочерний элемент: NavBarWidget(дочерний: дочерний), ); }, В BottomNavigationBar я хотел, чтобы анимация, перемещающаяся вправо, отображалась, когда я нажимаю на текущий элемент, и анимация, перемещающаяся влево, когда я нажимаю на левый элемент.
>
В коде ошибок не возникло, но анимация не изменилась.

мое приложение

Кроме того, базовая анимация маршрутизации в эмуляторах iOS и Android отображалась по-разному. Я использую эмулятор Android.

Что мне делать?
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»