Flutter如何使用BottomNavigationBar管理单独的导航堆栈?

时间:2020-07-16 12:40:09

标签: flutter flutter-navigation

我对Flutter如何一次管理多个导航堆栈以及如何使用BottomNavigationBar在它们之间切换感到困惑。到目前为止,我已经设法将根body的{​​{1}}交换为Scaffold,并且还可以更改Widget上的状态来更改Scaffold标题并设置AppBar的索引。我还可以看到在BottomNavigationBarItem上设置routes将如何推动和弹出其他屏幕。问题是,当您有一个标签栏导航模式时,您希望能够管理单独的堆栈。如果我深入某个部分并切换选项卡有3个级别,那么我希望该部分位于该堆栈中,并且能够在它们之间跳转。

如何使用Flutter进行管理?理想情况下,该应用程序应具有一个主应用程序MaterialApp来定义ScaffoldBottomNavigationBar以及用于在不同根级别屏幕之间进行切换的主要逻辑。然后,这些屏幕应该为该部分管理自己的Drawer和相关的AppBar

在继续使用actions之前,我真的很想了解这一点,因为现在,不得不用一个Flutter管理所有内容的想法使我感到恐惧。

我猜想,当您使用Scaffold时,它会使用Navigator来将堆栈保持在启动推送的屏幕上下文中,但是我仍然不明白它如何保持推送Context分开。

任何见识都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

这篇精彩的文章给了我答案:https://medium.com/flutter/getting-to-the-bottom-of-navigation-in-flutter-b3e440b9386

您需要将IndexedStack用于主要部分切换器,然后使用Widget来为每个主要部分返回NavigatorNavigator设置了该部分的路由(如果知道的话),但是可能只是其根。

我不知道Flutter社区是否已经使用了导航模式或命名约定,但是我使用了$(Section)Navigator。这是我为测试创建的StatelessWidget的示例:

class DashboardNavigator extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Navigator(
      onGenerateRoute: (RouteSettings settings) {
        return MaterialPageRoute(
          settings: settings,
          builder: (BuildContext context) {
            switch (settings.name) {
              case '/':
                return DashboardRoot();
              case '/login':
                return ScreenLogin(destination: allDestinations[0]);
              default:
                return DashboardRoot();
            }
          },
        );
      },
    );
  }
}

这主要来自Hans Muller的文章,对我们很有帮助。