首页 > 解决方案 > Flutter - Persisting BottomNavigationBar - 如何不在某些页面上显示?

问题描述

我的实现:

main.dart: - 它构建了多脚手架(底部导航栏正在UI树上方的所有屏幕上创建)

runApp(MaterialApp(
    debugShowCheckedModeBanner: false,
    title: "WP-seven",
    builder: (context, child) {
      return Scaffold(
        bottomNavigationBar: NavyBottomBar(navigator: (child.key as GlobalKey<NavigatorState>)),
        body: child,
      );
    },
    home: NewsList(0),
));

NavyBottomBar.dart:导航栏小部件的分离类。这里我们有一个 Global navigator 键,它在 main.dart 中用于连接到每个孩子的导航器(孩子是每个屏幕小部件。)

final GlobalKey<NavigatorState> navigator;

所以也有打开页面的逻辑,但是上面的代码足以在每个屏幕上显示bottomNavigationBar,并且能够导航。

问题是我不需要在每个屏幕上都有这个底部导航,应该有一种方法可以关闭某些屏幕上的导航栏。

可能有不同的方法来实现这个结果..?

标签: flutternavigationpersistencebottomnavigationview

解决方案


我找到了一个解决方案,效果很好,但首先要说几句话:

Hero不是一个选项,因为它不支持所有类型的导航,例如 pushReplacement,并且在使用它时我的 NavigationBar 中存在动画错误,可能是因为 hero 也具有内置动画。

解决方案:

  • 我创建了一个名为 homePage 的新屏幕(类似于导航中心)。
  • 我们有一个叫做 PageStorageBucket 的东西,它对于存储从一个页面到另一个页面的导航持续存在的每页状态很有用。在此处输入链接描述

主页.dart:

Widget newsList;
Widget favorites;
Widget profile;
Widget answers;

List<Widget> pages;
Widget currentPage;

final PageStorageBucket bucket = PageStorageBucket();

@override
void initState() {
  newsList = NewsList(isFavorite: 0);
  favorites = NewsList(isFavorite: 1);
  profile = Profile(userID: widget.userID);
  answers = Answers();

  pages = [newsList, favorites, profile, answers];

  currentPage = newsList;
  super.initState();
}

因此,我们在 PageStorage 存储桶中添加了一些小部件(屏幕),然后我们在主页的 Scaffold 中使用它......甚至还有一个地方。

@override
Widget build(BuildContext context) {
return Scaffold(
  body: PageStorage(
    child: currentPage,
    bucket: bucket,
  ),
  bottomNavigationBar: BottomNavyBar(
    currentIndex: currentTab,
    onItemSelected: (int index) async {
        setState(() {
          currentTab = index;
          currentPage = pages[index];
        });
    },
    items: [
      BottomNavyBarItem(
          icon: Icon(Icons.menu),
          title: Text('Новости'),
          activeColor: Colors.blue,
          inactiveColor: Colors.black
      ),
      BottomNavyBarItem(
          icon: Icon(Icons.favorite_border),
          title: Text('Избранное'),
          activeColor: Colors.red,
          inactiveColor: Colors.black
      ), 
     ],
    ),
   );
  }
 }

它完美地工作。

  • homePage Scaffold 是持久的,并且在重定向到另一个页面时不会重新渲染,因此我们可以使用带有动画和其他任何内容的导航栏。
  • 我们可以选择将哪些页面包含在此范围内。
  • 我们仍然可以在这些屏幕中使用 Navigator.push 和 else
  • 可以使用多脚手架,例如当您需要不同的 appBar 时,只需删除 homePage 的 appBar,它将使用打开的屏幕中的 appBar。

推荐阅读