Как перемещаться по BottomNavigationBar в другом виджете без сохранения состояния - PullRequest
0 голосов
/ 09 апреля 2020

У меня есть BottomNavigationBar в виджете без состояния. Я использую ViewModelProvider, чтобы контролировать изменение вкладки при событии onTap. У меня нет проблем с навигацией с помощью BottomNavigationBar, но я не смог управлять панелью навигации изнутри тела. Я использую следующий метод, я пытался использовать streambuilder для управления навигацией, но streambuilder будет распоряжаться содержимым при переходе на другую вкладку, а это не то, что мне нужно. Я не могу нажать кнопку на странице профиля и перейти на домашнюю страницу.

Ниже представлен мой виджет для BottomNavigationBar.

class BottomNavigationView extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return ViewModelProvider<BottomNavigationViewModel>.withConsumer(
      viewModel: BottomNavigationViewModel(),
      builder: (context, model, child) => Scaffold(
        primary: false,
        body: IndexedStack(
          children: <Widget>[
            BrowseView(),
            HomeView(),
            ProfileView(),
          ],
          index: model.currentIndex,
        ),
        bottomNavigationBar: BottomNavigationBar(
          type: BottomNavigationBarType.fixed,
          backgroundColor: Colors.white,
          currentIndex: model.currentIndex,
          onTap: model.changeView,
          items: [
            BottomNavigationBarItem(
              icon: new Icon(Icons.search),
              title: SizedBox.shrink(),
            ),
            BottomNavigationBarItem(
              icon: new Icon(Icons.home),
              title: SizedBox.shrink(),
            ),
            BottomNavigationBarItem(
              icon: new Icon(WineIcon.person),
              title: SizedBox.shrink(),
            ),
          ],
        ),
      ),
    );
  }
}

Панель навигации Модель

class BottomNavigationViewModel extends ChangeNotifier {
  int _currentIndex = 2;
  int get currentIndex => _currentIndex;

  void changeView(int index) {
    _currentIndex = index;
    notifyListeners();
  }
}

Просмотр профиля и Просмотр профиля Модель

class ProfileView extends StatelessWidget {
  const ProfileView ({Key key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return ViewModelProvider<ProfileViewModel>.withConsumer(
      viewModel: ProfileViewModel(),
      builder: (context, model, child) => Scaffold(
        body: Center(
          child: RaisedButton(
             onPressed: ()=> model.goHome(),
             child:Text('Go to Home'),
          ),
        )
      ),
    );
  }
}

class ProfileViewModel extends ChangeNotifier {
  final BottomNavigationViewModel _bottomNavigationBar =
      locator<BottomNavigationViewModel>();

  void goHome() {
    _bottomNavigationBar.changeView(1);
  }
}

1 Ответ

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

Не до конца понимаю, что вы подразумеваете под «неспособностью управлять панелью навигации изнутри тела». но я думаю, что вы подразумеваете, что btmnav ушел, когда вы перемещаетесь по каждой странице? Вы на полпути с помощью Indexstack, чтобы сохранить состояние страниц внутри. Я не использовал streambuilder с моей стороны, но для навигатора каждой страницы создавал глобальный ключ для использования.

Navigator(
          key: 1 key for each tab here,

          onGenerateRoute: (settings) => MaterialPageRoute(
            settings: settings,
            builder: (context) => page,
          ), // this will generate your pages

, если вы хотите заменить всю страницу, тогда

Navigator.of(context,rootNavigator: true).push(MaterialPageRoute(builder: (context) =>anotherpage)

, иначе просто установите rootNavigator на false

...