flutter 从HomeView导航到底部导航栏中的其他选项卡?

rdrgkggo  于 2023-02-13  发布在  Flutter
关注(0)|答案(2)|浏览(124)

我有一个底部导航栏,如下所示:

当我点击主页选项卡中的(1)时,它会导航到我的学习选项卡(2)中项目的详细信息页面,但不会导航到我的学习选项卡(使用Navigator.of(context).push())。但不会将底部导航栏中的选项卡更改为我的学习选项卡,它仍然是主页选项卡。所以我是如何解决这个问题的。谢谢。
部分代码:
类main_view_model(包含底部导航栏):

BottomTabItemAfterSignIn _currentBottomTab = BottomTabItemAfterSignIn.home;

  BottomTabItemAfterSignIn get currentBottomTab => _currentBottomTab;

  void changeTab(BottomTabItemAfterSignIn tab, {bool isBackClick = false}) {
    if (_currentBottomTab != tab) {
      _currentBottomTab = tab;
    }
  }

类主视图(_V):

@override
  Widget buildView(BuildContext context) {
    return WillPopScope(
      onWillPop: () async {
        _onPressBackDevice();

        return false;
      },
      child: Selector<MainUserViewModel, BottomTabItemAfterSignIn>(
        selector: (_, viewModel) => viewModel.currentBottomTab,
        builder: (_, currentBottomTab, __) {
          return Scaffold(
            backgroundColor: AppColor.neutrals.shade900,
            body: _buildBody(),
            bottomNavigationBar: BottomNavigationUserWidget(
              currentTab: currentBottomTab,
              onSelectTab: _selectTab,
            ),
          );
        },
      ),
    );
  }

  Widget _buildBody() {
    if (viewModel.currentBottomTab == BottomTabItemAfterSignIn.home) {
      return _buildTabItem(
        BottomTabItemAfterSignIn.home,
        _cacheBottomTabWidgets[BottomTabItemAfterSignIn.home],
      );
    } else if (viewModel.currentBottomTab == BottomTabItemAfterSignIn.course) {
      return _buildTabItem(
        BottomTabItemAfterSignIn.course,
        _cacheBottomTabWidgets[BottomTabItemAfterSignIn.course],
      );
    } else if (viewModel.currentBottomTab ==
        BottomTabItemAfterSignIn.myLearning) {
      return _buildTabItem(
        BottomTabItemAfterSignIn.myLearning,
        _cacheBottomTabWidgets[BottomTabItemAfterSignIn.myLearning],
      );
    } else {
      return _buildTabItem(
        BottomTabItemAfterSignIn.setting,
        _cacheBottomTabWidgets[BottomTabItemBeforeSignIn.setting],
      );
    }
  }

  Widget _buildTabItem(BottomTabItemAfterSignIn tabItem, Widget? child) {
    // Cache Widget
    return Offstage(
      offstage: viewModel.currentBottomTab != tabItem,
      child: child ??
          (viewModel.currentBottomTab == tabItem
              ? _buildCacheTab(tabItem)
              : Container()),
    );
  }

  Widget _buildCacheTab(BottomTabItemAfterSignIn tabItem) {
    return _cacheBottomTabWidgets[tabItem] =
        BottomBodyNavigationUserWidget(
      bottomMenuBar: tabItem,
      navigatorKey: _bottomTabKeys[tabItem]!,
    );
  }

  void _selectTab(BottomTabItemAfterSignIn bottomMenuBar) {
    viewModel.changeTab(bottomMenuBar);
  }
ig9co6j1

ig9co6j11#

我希望您使用的是有状态小部件,如果是这样,那么您必须使用setState((){})来影响任何值的更改,因此您的_currentBottomTab = tab;代码应该如下所示:

setState((){
        _currentBottomTab = tab;
    });

有关有状态小部件的更多信息,请查看here

8i9zcol2

8i9zcol22#

在1-tab上使用相同的功能并在你想去的地方传递索引号

changeTab(2),

相关问题