Flutter底部导航布局插件bottom_nav_layout的使用

发布于 1周前 作者 eggper 来自 Flutter

Flutter底部导航布局插件 bottom_nav_layout 的使用

简介

bottom_nav_layout 是一个用于构建带有底部导航栏的应用程序的快速布局插件。它消除了所有与底部导航栏协调相关的样板代码,并提供了额外的常见功能,如页面状态保存、懒加载页面、页面过渡动画等。

为什么选择 bottom_nav_layout

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

使用方法

安装

在你的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  bottom_nav_layout: ^3.0.10

快速开始示例

以下是一个简单的示例,展示了如何使用 bottom_nav_layout 插件创建一个带有底部导航栏的应用程序:

import 'package:bottom_nav_layout/bottom_nav_layout.dart';
import 'package:flutter/material.dart';

void main() => runApp(MaterialApp(
      home: BottomNavLayout(
        // 应用程序的目的地(页面)
        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'),
          ],
        ),
      ),
    ));

参数说明

名称 描述 默认值
pages 应用程序的目的地(页面)。 N/A
bottomNavigationBar 应用程序的底部导航栏。 N/A
savePageState 当为 false 时,每次导航时重新初始化页面(Material 行为)。当为 true 时,页面只初始化一次并在导航时隐藏/显示(Cupertino 行为)。 false
lazyLoadPages 当为 false 时,在开始时创建所有页面。当为 true 时,在首次导航到页面时才创建页面。 false
pageStack 记录访问过的页面顺序,增强 Android 上的返回按钮管理。 对于 Android 是 ReorderToFrontPageStack,对于 iOS 是 NoPageStack
extendBody 传递给 Scaffold.extendBody false
resizeToAvoidBottomInset 传递给 Scaffold.resizeToAvoidBottomInset true
pageTransitionData 页面过渡动画的配置。 null

页面状态保存

你可以启用或禁用页面状态保存功能。启用后,页面的状态(如滚动位置、子导航、表单输入等)将被保留。

savePageState: true, // 默认是 false

懒加载页面

你可以设置 lazyLoadPagestrue,以便在首次导航到页面时才创建页面。这对于包含启动动画或需要运行较重进程的页面非常有用。

lazyLoadPages: true, // 默认是 false

页面回退栈

bottom_nav_layout 记录了页面的导航顺序,并在按下返回按钮时返回到之前访问的页面。

// 默认是 ReorderToFrontPageStack 对于 Android 和 NoPageStack 对于 iOS。
pageStack: ReorderToFrontPageStack(initialPage: 0),

页面过渡动画

你可以设置页面之间的过渡动画。可以使用内置的动画构建器,也可以创建自己的 AnimationBuilder

// 默认是 null。
pageTransitionData: PageTransitionData(
  builder: PrebuiltAnimationBuilderBuilders.zoomInAndFadeOut,
  duration: 150,
  direction: AnimationDirection.inAndOut,
),

内页导航

每个页面都可以有自己的 Navigator,这样可以实现更复杂的导航模式。例如:

pages: [
  (navKey) => Navigator(
        key: navKey,
        initialRoute: "/",
        onGenerateRoute: (routeSettings) => MaterialPageRoute(
          builder: (context) {
            if (routeSettings.name == "/")
              return OverviewPage();
            else if (routeSettings.name == "/details")
              return DetailsPage();
            else
              return Center(child: Text("Unknown route."));
          },
        ),
      ),
  (_) => SliderPage(),
  (_) => SliderPage(),
],

不同的底部导航栏

bottom_nav_layout 支持任何底部导航栏。例如,使用 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'),
  ],
),

示例 Demo

下面是一个完整的示例,展示了如何使用 bottom_nav_layout 创建一个带有底部导航栏的应用程序:

import 'package:bottom_nav_layout/bottom_nav_layout.dart';
import 'package:flutter/material.dart';

class QuickStartExample extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return BottomNavLayout(
      pages: [
        (_) => Center(child: Text("Home Page")),
        (_) => Center(child: Text("Slider Page")),
        (_) => Center(child: TextField(decoration: InputDecoration(hintText: 'Search...'))),
      ],
      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'),
        ],
      ),
    );
  }
}

void main() => runApp(MaterialApp(
      home: QuickStartExample(),
    ));

更多关于Flutter底部导航布局插件bottom_nav_layout的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter底部导航布局插件bottom_nav_layout的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter中使用bottom_nav_layout插件来实现底部导航布局的一个代码案例。需要注意的是,bottom_nav_layout并不是Flutter官方的一个常用插件,但假设它是一个第三方插件,并且它的使用方法类似于常见的底部导航实现。如果实际插件的使用有所不同,请参考该插件的官方文档。

首先,确保你已经在pubspec.yaml文件中添加了bottom_nav_layout依赖项(假设这个插件存在):

dependencies:
  flutter:
    sdk: flutter
  bottom_nav_layout: ^x.y.z  # 请替换为实际的版本号

然后运行flutter pub get来安装插件。

接下来是一个使用bottom_nav_layout(假设它存在)的示例代码:

import 'package:flutter/material.dart';
import 'package:bottom_nav_layout/bottom_nav_layout.dart'; // 假设插件导入路径正确

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Bottom Nav Layout Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: BottomNavLayoutScreen(),
    );
  }
}

class BottomNavLayoutScreen extends StatefulWidget {
  @override
  _BottomNavLayoutScreenState createState() => _BottomNavLayoutScreenState();
}

class _BottomNavLayoutScreenState extends State<BottomNavLayoutScreen> {
  int _selectedIndex = 0;
  final List<Widget> _widgetOptions = <Widget>[
    Text('Home Screen'),
    Text('Search Screen'),
    Text('Profile Screen'),
  ];

  void _onItemTapped(int index) {
    setState(() {
      _selectedIndex = index;
    });
  }

  @override
  Widget build(BuildContext context) {
    return BottomNavLayout( // 假设这是插件提供的布局组件
      currentIndex: _selectedIndex,
      onTap: _onItemTapped,
      items: <BottomNavigationBarItem>[
        BottomNavigationBarItem(
          icon: Icon(Icons.home),
          label: 'Home',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.search),
          label: 'Search',
        ),
        BottomNavigationBarItem(
          icon: Icon(Icons.person),
          label: 'Profile',
        ),
      ],
      body: _widgetOptions[_selectedIndex],
    );
  }
}

在这个示例中,我们假设BottomNavLayout是一个类似于BottomNavigationBar的组件,但它封装了布局逻辑,使得我们只需要提供导航项和对应的页面内容。

  • currentIndex:当前选中的导航项的索引。
  • onTap:点击导航项时的回调函数。
  • items:底部导航项列表。
  • body:当前显示的页面内容。

请注意,如果bottom_nav_layout插件实际上不存在或者它的API与上述示例有所不同,请参考该插件的官方文档进行具体实现。在Flutter社区中,通常推荐使用BottomNavigationBarOffstageIndexedStack等组件结合来实现底部导航布局,这是更常见和灵活的方法。

回到顶部