bottom_nav_layout

这是一个快速的 Flutter 应用布局,用于构建带有底部导航栏的应用。您可以用 15 行代码得到一个流畅运行的应用。

125905278-4c0c7f21-a1df-42a9-aaff-c2b901267339

为什么选择 bottom_nav_layout

  • 消除了底部导航栏协调的所有样板代码。
  • 提供额外的常见功能。
    • 页面状态保存
    • 页面懒加载
    • 页面过渡动画
    • 页面内导航
    • Android 的返回按钮导航
  • 适用于任何您想要的底部导航栏。可以使用 Material 或 Cupertino 底部导航栏,从 pub.dev 获取一个 或使用您自己的。
  • 您可以自定义或关闭任何功能。

125903612-92e0d0ac-eaf1-4714-850d-90747b94cee5

用法

安装

将以下内容添加到您的 pubspec.yaml 文件中。

dependencies:
  bottom_nav_layout: latest_version

快速入门示例

import 'package:bottom_nav_layout/bottom_nav_layout.dart';

void main() => runApp(MaterialApp(
      home: BottomNavLayout(
        // The app's destinations
        pages: [
          (_) => Center(child: Text("Welcome to bottom_nav_layout")),
          (_) => SliderPage(),
          (_) => Center(child: TextField(decoration: InputDecoration(hintText: 'Go..'))),
        ],
        bottomNavigationBar: (currentIndex, onTap) => BottomNavigationBar(
          currentIndex: currentIndex,
          onTap: (index) => onTap(index),
          items: [
            BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
            BottomNavigationBarItem(icon: Icon(Icons.linear_scale), label: 'Slider'),
            BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Search'),
          ],
        ),
      ),
    ));

完成。您现在拥有一个完整的、可运行的应用程序。

SliderPage 代码

参数

名称 描述 默认值
pages 应用程序的目标页面。 不适用
bottomNavigationBar 布局的底部导航栏。 不适用
savePageState 当设置为 false 时,每次导航页面时都会重新初始化页面。(Material 行为)。设置为 true 时,页面仅初始化一次,并在导航时隐藏/显示。(Cupertino 行为)
lazyLoadPages 当设置为 false 时,页面在开始时创建。设置为 true 时,页面在首次导航时创建。
pageStack 用于记住已访问页面的导航堆栈。增强了 Android 上的返回按钮管理。 Android 的 ReorderToFrontPageStack,iOS 的 NoPageStack
extendBody 传递给 Scaffold.extendBody
resizeToAvoidBottomInset 传递给 Scaffold.resizeToAvoidBottomInset
pageTransitionData 页面过渡的动画配置。

内部 Widget 树

inner_widget_tree


image

页面状态保存

您在页面中所做的状态更改,如滚动量、子导航、表单输入等都会被保留。您可以根据 Cupertino 设计指南启用它,或根据 Material Design 指南禁用它。

savePageState: true, // Default is false

页面懒加载

该布局提供了使用传入的页面构建器懒惰创建页面的选项。当 lazyLoadPages 设置为 true 时,页面直到首次导航到时才会被创建。这在非初始页面:

  • 具有加载动画时很有用。
  • 运行一个直到页面打开才需要的重度进程时很有用。
lazyLoadPages: true, // Default is false

页面返回堆栈

文档 示例
文档 -

该布局会记住导航页面的顺序,并且在按下返回按钮时,会导航回先前导航的页面。

有许多有用的页面返回堆栈行为已实现,例如 reorder-to-front 和 replace-except-first。您也可以实现自己的。

您也可以在 PageStack 中指定 initialPage

// Default is ReorderToFrontPageStack for Android and NoPageStack for iOS.
pageStack: ReorderToFrontPageStack(initialPage: 0),

了解更多详情。

页面过渡动画

文档 示例
- 示例

您可以为页面之间的过渡设置动画。创建您自己的 AnimationBuilder 或使用内置的一个。

这些动画同时适用于底部导航栏和 Android 返回按钮。

// Default is null.
pageTransitionData: PageTransitionData(
  builder: PrebuiltAnimationBuilderBuilders.zoomInAndFadeOut,
  duration: 150,
  direction: AnimationDirection.inAndOut,
),

页面内导航

文档 示例
文档 示例

该布局维护一个 扁平导航模式


图示:扁平导航

优势

  1. 每个页面可以使用一个 Navigator
  2. Android 返回按钮可以同时在页面内和页面之间进行导航。
  3. 当重新选择当前导航栏项目时,底部导航栏会弹出所有页面内堆栈。

要实现这一点,页面应该有一个使用传入的 GlobalKey 作为其 key 的 Navigator widget。

不同的底部导航栏

文档 示例
文档 示例

到目前为止,我们只处理了 Material 底部导航栏。该布局支持任何底部导航栏。

使用 flutter_snake_navigationbar 的示例

bottomNavigationBar: (currentIndex, onTap) => SnakeNavigationBar.color(
  currentIndex: currentIndex,
  onTap: (index) => onTap(index),
  items: [
    BottomNavigationBarItem(icon: Icon(Icons.home), label: 'Home'),
    BottomNavigationBarItem(icon: Icon(Icons.linear_scale), label: 'Slider'),
    BottomNavigationBarItem(icon: Icon(Icons.search), label: 'Search'),
  ],
),

改进

  • 如果您希望在您的应用程序中看到此软件包中存在的/需要的某个功能,请告诉我。我会尽力集成它。
  • 我还在考虑做一个 drawer_nav_layout 包。如果您感兴趣,请告诉我!

GitHub

https://github.com/m-azyoksul/bottom_nav_layout