Выбранный элемент не обновляется в BottomNavigationBar Flutter ⇐ IOS
-
Гость
Выбранный элемент не обновляется в BottomNavigationBar Flutter
Когда я нахожусь на экране бронирования, а затем переключаюсь на команды, основные моменты или любую другую опцию по порядку, при нажатии назад на этих экранах выбранный элемент на нижней панели навигации остается фиксированным и не меняется при закрытии экрана. обратно.
Например, когда я нажимаю на элемент статистики в нижней панели навигации, а затем перехожу к экрану статистики, при нажатии кнопки «Назад» экран меняется на предыдущий. Однако на нижней панели навигации элемент статистики по-прежнему отображается выделенным зеленым цветом вместо обозначения текущего экрана.
Ниже приведен код виджета HomeView:
import 'package:flutter/cupertino.dart'; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: sportifan_user/screens/main/bookings.dart»; импортировать «пакет: sportifan_user/screens/main/choose_match.dart»; импортировать «пакет: sportifan_user/screens/main/create_team.dart»; импортировать «пакет: sportifan_user/screens/main/edit_team.dart»; импортировать «пакет: sportifan_user/screens/main/highlights.dart»; импортировать «пакет: sportifan_user/screens/main/stats.dart»; импортировать «пакет: sportifan_user/screens/main/venue_screen.dart»; импортировать «пакет: sportifan_user/screens/main/your_teams.dart»; импортировать «пакет: sportifan_user/widgets/highlights_widget.dart»; импортировать «пакет: sportifan_user/widgets/sidebar.dart»; импортировать «пакет: sportifan_user/widgets/top_navigation_bar.dart»; класс HomeView расширяет StatefulWidget { const HomeView({super.key}); @переопределить State createState() => _HomeViewState(); } класс _HomeViewState расширяет State с помощью RouteAware { интервал текущегоиндекса = 0; окончательный GlobalKey _scaffoldKey = GlobalKey(); окончательный GlobalKey navigatorKey = GlobalKey(); void onTap(int index) { setState(() { текущийИндекс = индекс; }); переключатель (индекс) { случай 0: navigatorKey.currentState?.pushNamed('/'); перерыв; Дело 1: navigatorKey.currentState?.pushNamed('/teams'); перерыв; случай 2: navigatorKey.currentState?.pushNamed('/highlights'); перерыв; случай 3: navigatorKey.currentState?.pushNamed('/stats'); перерыв; } } окончательный RouteObserver RouteObserver = RouteObserver(); @переопределить void DidChangeDependities() { super.didChangeDependency(); RouteObserver.subscribe(this, ModalRoute.of(context) as PageRoute); } @переопределить недействительный располагать () { RouteObserver.unsubscribe(это); супер.dispose(); } @переопределить недействительный DidPopNext () { _updateCurrentIndex(); } void _updateCurrentIndex() { // Определите этот метод для обновления currentIndex на основе текущего маршрута переключатель (ModalRoute.of(context)?.settings.name) { случай '/': setState(() { текущийИндекс = 0; }); перерыв; случай '/команды': setState(() { текущийИндекс = 1; }); перерыв; случай '/основные моменты': setState(() { текущийИндекс = 2; }); перерыв; случай '/статистика': setState(() { текущийИндекс = 3; }); перерыв; } } @переопределить Сборка виджета (контекст BuildContext) { TextEditingController teamController = TextEditingController(); TextEditingController uidController = TextEditingController(); Контроллер TextEditingController = TextEditingController(); вернуть WillPopScope( onWillPop: () асинхронный { if (navigatorKey.currentState?.canPop() ?? false) { navigatorKey.currentState?.pop(); Future.delayed(Duration.zero, () { _updateCurrentIndex(); // Добавляем эту строку }); вернуть ложь; // Предотвращаем поведение кнопки «Назад» по умолчанию } вернуть истину; // Разрешить поведение кнопки «Назад» по умолчанию, если нет маршрута для открытия }, ребенок: Контейнер( цвет: Цвет (0xFF238F20), дочерний: SafeArea( ребенок: Эшафод( ключ: _scaffoldKey, appBar: PreferredSize( PreferredSize: Size.fromHeight(72.0), // Здесь задается высота дочерний элемент: TopNavigationBar( контроллер: контроллер, onNotificationIconTapped: () { _scaffoldKey.currentState?.openDrawer(); }, ), ), ящик: SideBar( уведомлениеExists: правда, ), тело: NotificationListener( onNotification: (уведомление) { _updateCurrentIndex(); вернуть истину; }, ребенок: Навигатор( ключ: NavigatorKey, начальныйRoute: '/', onGenerateRoute: (настройки RouteSettings) { конструктор виджетов; переключатель (settings.name) { случай '/': строитель = (BuildContext _) => BookingView(); перерыв; случай '/команды': строитель = (BuildContext _) => ВашиКоманды(); перерыв; случай '/основные моменты': строитель = (BuildContext _) => HighlightsView (highlightsExists: true); перерыв; случай '/статистика': строитель = (BuildContext _) => StatsView (statsExists: true); перерыв; по умолчанию: throw Exception('Неверный маршрут: ${settings.name}'); } вернуть MaterialPageRoute( строитель: строитель, настройки: настройки); }, ), ), BottomNavigationBar: Тема( данные: Theme.of(context).copyWith( Цвет холста: Цвета.белый, первичныйЦвет: Цвет (0xFF238F20), textTheme: Theme.of(context).textTheme.copyWith( подпись: TextStyle(цвет: Colors.grey), ), BottomNavigationBarTheme: BottomNavigationBarThemeData( Цвет фона: Цвета.белый, высота: 0, ), ), дочерний элемент: BottomNavigationBar( текущийИндекс: текущийИндекс, onTap: onTap, предметы: [ BottomNavigationBarItem( значок: Значок( Иконки.книга, ), ярлык: «Бронирование», ), BottomNavigationBarItem( значок: Значок(Icons.people), метка: «Команды», ), BottomNavigationBarItem( значок: Значок (Icons.sports_cricket), ярлык: «Основные моменты», ), BottomNavigationBarItem( значок: Значок (Icons.graphic_eq), ярлык: «Статистика», ), ], выбранныйItemColor: Color(0xFF238F20), // измените его на предпочитаемый вами цвет unselectedItemColor: Colors.grey, showSelectedLabels: правда, showUnselectedLabels: правда, ), ), ), ), ), ); } } класс PopNavigatorNotification расширяет уведомление {} Я приложил много усилий, как вы увидите, просматривая код, но, к сожалению, ничего не получил взамен. Если кто-то может помочь, сделайте это.
Когда я нахожусь на экране бронирования, а затем переключаюсь на команды, основные моменты или любую другую опцию по порядку, при нажатии назад на этих экранах выбранный элемент на нижней панели навигации остается фиксированным и не меняется при закрытии экрана. обратно.
Например, когда я нажимаю на элемент статистики в нижней панели навигации, а затем перехожу к экрану статистики, при нажатии кнопки «Назад» экран меняется на предыдущий. Однако на нижней панели навигации элемент статистики по-прежнему отображается выделенным зеленым цветом вместо обозначения текущего экрана.
Ниже приведен код виджета HomeView:
import 'package:flutter/cupertino.dart'; импортировать «пакет: флаттер/материал.dart»; импортировать «пакет: sportifan_user/screens/main/bookings.dart»; импортировать «пакет: sportifan_user/screens/main/choose_match.dart»; импортировать «пакет: sportifan_user/screens/main/create_team.dart»; импортировать «пакет: sportifan_user/screens/main/edit_team.dart»; импортировать «пакет: sportifan_user/screens/main/highlights.dart»; импортировать «пакет: sportifan_user/screens/main/stats.dart»; импортировать «пакет: sportifan_user/screens/main/venue_screen.dart»; импортировать «пакет: sportifan_user/screens/main/your_teams.dart»; импортировать «пакет: sportifan_user/widgets/highlights_widget.dart»; импортировать «пакет: sportifan_user/widgets/sidebar.dart»; импортировать «пакет: sportifan_user/widgets/top_navigation_bar.dart»; класс HomeView расширяет StatefulWidget { const HomeView({super.key}); @переопределить State createState() => _HomeViewState(); } класс _HomeViewState расширяет State с помощью RouteAware { интервал текущегоиндекса = 0; окончательный GlobalKey _scaffoldKey = GlobalKey(); окончательный GlobalKey navigatorKey = GlobalKey(); void onTap(int index) { setState(() { текущийИндекс = индекс; }); переключатель (индекс) { случай 0: navigatorKey.currentState?.pushNamed('/'); перерыв; Дело 1: navigatorKey.currentState?.pushNamed('/teams'); перерыв; случай 2: navigatorKey.currentState?.pushNamed('/highlights'); перерыв; случай 3: navigatorKey.currentState?.pushNamed('/stats'); перерыв; } } окончательный RouteObserver RouteObserver = RouteObserver(); @переопределить void DidChangeDependities() { super.didChangeDependency(); RouteObserver.subscribe(this, ModalRoute.of(context) as PageRoute); } @переопределить недействительный располагать () { RouteObserver.unsubscribe(это); супер.dispose(); } @переопределить недействительный DidPopNext () { _updateCurrentIndex(); } void _updateCurrentIndex() { // Определите этот метод для обновления currentIndex на основе текущего маршрута переключатель (ModalRoute.of(context)?.settings.name) { случай '/': setState(() { текущийИндекс = 0; }); перерыв; случай '/команды': setState(() { текущийИндекс = 1; }); перерыв; случай '/основные моменты': setState(() { текущийИндекс = 2; }); перерыв; случай '/статистика': setState(() { текущийИндекс = 3; }); перерыв; } } @переопределить Сборка виджета (контекст BuildContext) { TextEditingController teamController = TextEditingController(); TextEditingController uidController = TextEditingController(); Контроллер TextEditingController = TextEditingController(); вернуть WillPopScope( onWillPop: () асинхронный { if (navigatorKey.currentState?.canPop() ?? false) { navigatorKey.currentState?.pop(); Future.delayed(Duration.zero, () { _updateCurrentIndex(); // Добавляем эту строку }); вернуть ложь; // Предотвращаем поведение кнопки «Назад» по умолчанию } вернуть истину; // Разрешить поведение кнопки «Назад» по умолчанию, если нет маршрута для открытия }, ребенок: Контейнер( цвет: Цвет (0xFF238F20), дочерний: SafeArea( ребенок: Эшафод( ключ: _scaffoldKey, appBar: PreferredSize( PreferredSize: Size.fromHeight(72.0), // Здесь задается высота дочерний элемент: TopNavigationBar( контроллер: контроллер, onNotificationIconTapped: () { _scaffoldKey.currentState?.openDrawer(); }, ), ), ящик: SideBar( уведомлениеExists: правда, ), тело: NotificationListener( onNotification: (уведомление) { _updateCurrentIndex(); вернуть истину; }, ребенок: Навигатор( ключ: NavigatorKey, начальныйRoute: '/', onGenerateRoute: (настройки RouteSettings) { конструктор виджетов; переключатель (settings.name) { случай '/': строитель = (BuildContext _) => BookingView(); перерыв; случай '/команды': строитель = (BuildContext _) => ВашиКоманды(); перерыв; случай '/основные моменты': строитель = (BuildContext _) => HighlightsView (highlightsExists: true); перерыв; случай '/статистика': строитель = (BuildContext _) => StatsView (statsExists: true); перерыв; по умолчанию: throw Exception('Неверный маршрут: ${settings.name}'); } вернуть MaterialPageRoute( строитель: строитель, настройки: настройки); }, ), ), BottomNavigationBar: Тема( данные: Theme.of(context).copyWith( Цвет холста: Цвета.белый, первичныйЦвет: Цвет (0xFF238F20), textTheme: Theme.of(context).textTheme.copyWith( подпись: TextStyle(цвет: Colors.grey), ), BottomNavigationBarTheme: BottomNavigationBarThemeData( Цвет фона: Цвета.белый, высота: 0, ), ), дочерний элемент: BottomNavigationBar( текущийИндекс: текущийИндекс, onTap: onTap, предметы: [ BottomNavigationBarItem( значок: Значок( Иконки.книга, ), ярлык: «Бронирование», ), BottomNavigationBarItem( значок: Значок(Icons.people), метка: «Команды», ), BottomNavigationBarItem( значок: Значок (Icons.sports_cricket), ярлык: «Основные моменты», ), BottomNavigationBarItem( значок: Значок (Icons.graphic_eq), ярлык: «Статистика», ), ], выбранныйItemColor: Color(0xFF238F20), // измените его на предпочитаемый вами цвет unselectedItemColor: Colors.grey, showSelectedLabels: правда, showUnselectedLabels: правда, ), ), ), ), ), ); } } класс PopNavigatorNotification расширяет уведомление {} Я приложил много усилий, как вы увидите, просматривая код, но, к сожалению, ничего не получил взамен. Если кто-то может помочь, сделайте это.
Мобильная версия