如何在另一个无状态小部件中导航BottomNavigationBar

时间:2020-04-09 12:35:18

标签: flutter dart flutter-bottomnavigation

我在无状态小部件中有一个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 :(得分:0)

不完全理解“无法从体内控制导航栏”的含义。但是我认为您的意思是当您在每个页面中导航时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