Как перемещаться по BottomNavigationBar в другом виджете без сохранения состояния

У меня есть 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);
  }
}

person Chun Lin    schedule 09.04.2020    source источник


Ответы (1)


Не совсем понимаю, что вы имеете в виду под «невозможностью управлять панелью навигации изнутри тела». но я думаю, вы имеете в виду, что 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

person Solly    schedule 10.04.2020
comment
Я имел в виду, что мне нравится перемещаться по нижней панели навигации без использования вкладок на самой панели. Мне нравится перемещаться по нему с помощью кнопки внутри страницы. - person Chun Lin; 10.04.2020