Flutter BottomNavigationBar 详解

目录

一、引言

[二、BottomNavigationBar 的基本用法](#二、BottomNavigationBar 的基本用法)

三、主要属性

[1. 基本配置](#1. 基本配置)

[2. 导航项配置](#2. 导航项配置)

[3. 导航类型选择](#3. 导航类型选择)

四、高级功能实现

[1. 结合 PageView 实现滑动切换](#1. 结合 PageView 实现滑动切换)

[2. 添加徽章提示](#2. 添加徽章提示)

[3. 自定义凸起按钮(FAB融合)](#3. 自定义凸起按钮(FAB融合))

[4. 渐变背景实现](#4. 渐变背景实现)

[五、自定义 BottomNavigationBar](#五、自定义 BottomNavigationBar)

[1. 使用 BottomNavigationBarType.shifting](#1. 使用 BottomNavigationBarType.shifting)

[2. 自定义 selectedFontSize 和 unselectedFontSize](#2. 自定义 selectedFontSize 和 unselectedFontSize)

六、最佳实践指南

[1. 导航项数量控制](#1. 导航项数量控制)

[2. 状态管理策略](#2. 状态管理策略)

[3. 跨平台适配](#3. 跨平台适配)

七、结论

相关推荐


一、引言

在 Flutter 应用中,BottomNavigationBar 是用于实现底部导航栏的组件,适用于具有多个页面或功能的应用,例如社交媒体、购物应用等。用户可以通过底部导航快速切换不同的页面或视图。本文将介绍 BottomNavigationBar 的基本用法、主要属性以及自定义样式。

二、BottomNavigationBar 的基本用法

BottomNavigationBar 需要 items 定义导航项,并使用 currentIndex 追踪选中的索引。

Dart 复制代码
int _currentIndex = 0;

Scaffold(
  bottomNavigationBar: BottomNavigationBar(
    currentIndex: _currentIndex,
    onTap: (index) => setState(() => _currentIndex = index),
    items: [
      BottomNavigationBarItem(icon: Icon(Icons.home), label: '首页'),
      BottomNavigationBarItem(icon: Icon(Icons.add), label: '发布'),
      BottomNavigationBarItem(icon: Icon(Icons.person), label: '我的'),
    ],
  ),
)
  • Navigation Items:包含图标和标签的导航项

  • Current Index:当前选中项的索引

  • Tap Handler:点击事件的回调处理

  • 动画系统:自带动画切换效果

三、主要属性

1. 基本配置

Dart 复制代码
BottomNavigationBar(
  selectedItemColor: Colors.blue, // 选中颜色
  unselectedItemColor: Colors.grey, // 未选中颜色
  showSelectedLabels: true, // 显示选中标签
  showUnselectedLabels: false, // 隐藏未选中标签
  type: BottomNavigationBarType.fixed, // 固定样式
)

2. 导航项配置

Dart 复制代码
BottomNavigationBarItem(
  icon: Icon(Icons.notifications),
  label: '消息',
  activeIcon: Icon(Icons.notifications_active), // 激活状态图标
  backgroundColor: Colors.red, // 仅对 shifting 类型有效
)

3. 导航类型选择

Dart 复制代码
type: BottomNavigationBarType.shifting, // 动态背景色类型
// 或
type: BottomNavigationBarType.fixed,    // 固定背景色类型(默认)

四、高级功能实现

1. 结合 PageView 实现滑动切换

Dart 复制代码
PageController _pageController = PageController();

BottomNavigationBar(
  currentIndex: _currentIndex,
  onTap: (index) {
    setState(() => _currentIndex = index);
    _pageController.jumpToPage(index);
  },
)

PageView(
  controller: _pageController,
  onPageChanged: (index) => setState(() => _currentIndex = index),
  children: [HomePage(), SearchPage(), ProfilePage()],
)

2. 添加徽章提示

Dart 复制代码
BottomNavigationBarItem(
  icon: Stack(
    children: [
      Icon(Icons.shopping_cart),
      Positioned(
        right: 0,
        child: Container(
          padding: EdgeInsets.all(2),
          decoration: BoxDecoration(
            color: Colors.red,
            shape: BoxShape.circle,
          ),
          child: Text('3', style: TextStyle(color: Colors.white, fontSize: 10)),
        ),
      )
    ],
  ),
  label: '购物车',
)

3. 自定义凸起按钮(FAB融合)

Dart 复制代码
bottomNavigationBar: BottomAppBar(
  shape: CircularNotchedRectangle(), // 底部凹槽形状
  child: BottomNavigationBar(...),
),

floatingActionButton: FloatingActionButton(
  onPressed: () {},
  child: Icon(Icons.add),
),
floatingActionButtonLocation: FloatingActionButtonLocation.centerDocked,

4. 渐变背景实现

Dart 复制代码
Container(
  decoration: BoxDecoration(
    gradient: LinearGradient(
      colors: [Colors.blue, Colors.purple],
      begin: Alignment.centerLeft,
      end: Alignment.centerRight,
    ),
  ),
  child: BottomNavigationBar(...),
)

五、自定义 BottomNavigationBar

1. 使用 BottomNavigationBarType.shifting

Dart 复制代码
BottomNavigationBar(
  type: BottomNavigationBarType.shifting,
  selectedItemColor: Colors.white,
  unselectedItemColor: Colors.black,
  backgroundColor: Colors.blue,
  items: const [
    BottomNavigationBarItem(icon: Icon(Icons.dashboard), label: '仪表盘'),
    BottomNavigationBarItem(icon: Icon(Icons.notifications), label: '通知'),
  ],
)

2. 自定义 selectedFontSizeunselectedFontSize

Dart 复制代码
BottomNavigationBar(
  selectedFontSize: 16,
  unselectedFontSize: 12,
  items: const [
    BottomNavigationBarItem(icon: Icon(Icons.map), label: '地图'),
    BottomNavigationBarItem(icon: Icon(Icons.info), label: '信息'),
  ],
)

六、最佳实践指南

1. 导航项数量控制

  • 移动端:3-5 个选项为最佳

  • Web/桌面端:可适当增加但不超过 7 个

  • 更多选项考虑使用 Drawer 或 TabBar

2. 状态管理策略

  • 使用 Provider/Riverpod 管理全局状态

  • 保持导航状态与页面栈同步

  • 考虑使用 IndexedStack 保持页面状态

3. 跨平台适配

  • iOS:通常使用较大的标签和图标

  • Android:推荐 Material Design 规范

  • 使用 Platform.isIOS 进行平台判断

七、结论

BottomNavigationBar 是 Flutter 中用于底部导航的组件,适用于多页面应用。通过 currentIndexonTap 实现页面切换,并可使用 typeselectedItemColorunselectedItemColor 进行自定义。掌握 BottomNavigationBar,可以提升应用的导航体验。

相关推荐

Flutter ListView 详解-CSDN博客文章浏览阅读1.2k次,点赞35次,收藏29次。ListView 是 Flutter 中用于构建滚动列表的核心组件,支持垂直、水平滚动以及复杂的动态布局。本文将深入解析其核心用法、性能优化策略和高级功能实现,助你打造流畅高效的列表界面。_flutter listviewhttps://shuaici.blog.csdn.net/article/details/147290041Flutter Expanded 与 Flexible 详解-CSDN博客文章浏览阅读2.5k次,点赞66次,收藏68次。Expanded 和 Flexible 是 Flutter 中用于控制弹性布局的重要组件。Expanded 强制填充空间,而 Flexible 允许子组件决定是否扩展。理解它们的差异并结合 flex 参数,可以更高效地实现响应式 UI 布局。_flutter expandedhttps://shuaici.blog.csdn.net/article/details/146070160

相关推荐
千里马学框架2 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台2 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone2 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc2 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
MoonMoonLee2 天前
小程序配置
小程序
ttyyttemo2 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077002 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼2 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
茶底世界之下2 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
AFinalStone2 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui