Как обновить состояние нижней панели навигации из NavigatorObserver? - PullRequest
0 голосов
/ 12 апреля 2020

Я создаю нижнюю панель навигации, и все работает нормально, кроме случаев, когда пользователь нажимает кнопку «Назад» на своем устройстве. Состояние панели навигации не обновляется для отображения страницы, на которой они находятся. Чтобы это исправить, я узнал о NavigatorObserver. Теперь я вижу, когда маршрут прерывается, но у меня нет возможности обновить состояние. Моя навигационная панель использует маршруты, поэтому, когда пользователь нажимает кнопку, он выводит новый маршрут. Я пытаюсь обновить индекс панели навигации, но не вижу способа сделать это. Навбар использует StatefulWidget, поэтому я могу использовать обратный вызов setState.

Я пробовал использовать ключи, но не могу использовать их повторно, поскольку они находятся на разных Scaffold с. Я не могу получить доступ к BuildContext из NavigationObserver, поэтому я не могу использовать такие вещи, как Provider, чтобы уведомить об изменении и восстановить.

class CustomBottomNavBar extends StatefulWidget {
  @override
  _CustomBottomNavBarState createState() => _CustomBottomNavBarState();
}

class _CustomBottomNavBarState extends State<CustomBottomNavBar> {
  static int _selectedIndex;
  int get selectedIndex => _selectedIndex;
  set selectedIndex(int newIndex) {
    setState(() {
      _selectedIndex = newIndex;
    });
  }

  //...
}
class NavBarObserver extends NavigatorObserver {
  @override
  void didPop(Route route, Route previousRoute) {
    final navBarRoutes = Routes.all.sublist(0,4);
    final routeName = route.settings.name;
    if (navBarRoutes.contains(routeName)) {
      final index = navBarRoutes.indexOf(routeName);
      // selectedIndex = index;
    }
  }
}

1 Ответ

0 голосов
/ 12 апреля 2020

Вы можете сделать это несколькими способами. Здесь я привел пример с ValueNotifier. Сначала вы можете создать перечисление, которое определяет различные страницы вашей нижней панели навигации. Затем вы создаете ValueNotifier с вашим типом enum и делитесь им между NavBarObserver и CustomBottomNavBar. В NavBarObserver, когда происходило любое изменение табуляции, вы просто обновляли значение ValueNotifier значением перечисления соответствующей вкладки. Вы можете прослушать ValueNotifier изменение значения в _CustomBottomNavBarState, чтобы обновить состояние нижней панели навигации.

enum Tabs{one, two, three}

class CustomBottomNavBar extends StatefulWidget {
  final ValueNotifier<Tabs> tabsChangeNotifier;

  CustomBottomNavBar(this.tabsChangeNotifier);

  @override
  _CustomBottomNavBarState createState() => _CustomBottomNavBarState();
}

class _CustomBottomNavBarState extends State<CustomBottomNavBar> {
  Tabs _currentTab;

  @override
  void initState() {
    super.initState();
    widget.tabsChangeNotifier.addListener(() {
       setState(() {
         _currentTab = widget.tabsChangeNotifier.value;
       });
    });
    }
  }


class NavBarObserver extends NavigatorObserver {
  final ValueNotifier<Tabs> tabsChangeNotifier;

  NavBarObserver(this.tabsChangeNotifier);

  @override
  void didPop(Route route, Route previousRoute) {
    final navBarRoutes = Routes.all.sublist(0,4);
    final routeName = route.settings.name;
    if (navBarRoutes.contains(routeName)) {
      tabsChangeNotifier.value = Tabs.two;
      // selectedIndex = index;
    }
  }
}
...