首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Flutter 零基础入门(四十):TabBar 与底部导航栏 —— 多页面切换与布局技巧

Flutter 零基础入门(四十):TabBar 与底部导航栏 —— 多页面切换与布局技巧

作者头像
LarryLan
发布2026-03-03 15:49:47
发布2026-03-03 15:49:47
70
举报

TabBar 与底部导航栏 —— 多页面切换与布局技巧

到目前为止,你已经掌握了:

  • 动态列表刷新(Pull-to-Refresh + 分页)
  • 异步数据请求与显示
  • SnackBar / AlertDialog 提示
  • StatefulWidget 与 setState 控制动态 UI

接下来,我们进入 多页面 App 架构

  • TabBar → 顶部标签页
  • BottomNavigationBar → 底部导航
  • 页面切换与状态保持

一、TabBar 基础

1️⃣ 基本结构

代码语言:javascript
复制
DefaultTabController(
  length: 3, // 标签数量
  child: Scaffold(
    appBar: AppBar(
      title: Text('TabBar 示例'),
      bottom: TabBar(
        tabs: [
          Tab(text: '首页'),
          Tab(text: '消息'),
          Tab(text: '我的'),
        ],
      ),
    ),
    body: TabBarView(
      children: [
        Center(child: Text('首页内容')),
        Center(child: Text('消息内容')),
        Center(child: Text('我的内容')),
      ],
    ),
  ),
);

📌 关键点:

  • DefaultTabController → 管理 Tab 状态
  • TabBar → 标签
  • TabBarView → 内容页与标签对应

2️⃣ TabBar 样式自定义

代码语言:javascript
复制
TabBar(
  labelColor: Colors.blue,
  unselectedLabelColor: Colors.grey,
  indicatorColor: Colors.blue,
  indicatorWeight: 3,
  tabs: [
    Tab(icon: Icon(Icons.home), text: '首页'),
    Tab(icon: Icon(Icons.message), text: '消息'),
    Tab(icon: Icon(Icons.person), text: '我的'),
  ],
)

📌 可以自定义:

  • 图标 / 文本
  • 标签选中颜色 / 未选中颜色
  • 下划线颜色 / 宽度

二、BottomNavigationBar 基础

1️⃣ 基本用法

代码语言:javascript
复制
class BottomNavPage extends StatefulWidget {
  @override
  _BottomNavPageState createState() => _BottomNavPageState();
}

class _BottomNavPageState extends State<BottomNavPage> {
  int _currentIndex = 0;

  final List<Widget> _pages = [
    Center(child: Text('首页')),
    Center(child: Text('消息')),
    Center(child: Text('我的')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: _pages[_currentIndex],
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: '首页'),
          BottomNavigationBarItem(icon: Icon(Icons.message), label: '消息'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: '我的'),
        ],
      ),
    );
  }
}

📌 功能解析:

  • _currentIndex → 当前页面索引
  • setState 切换页面
  • BottomNavigationBarItem → 图标 + 文本

2️⃣ 状态保持

在 BottomNavigationBar 多页面切换中,如果每个页面都是 StatefulWidget,默认会被重新创建。 解决办法:用 IndexedStack 保持页面状态:

代码语言:javascript
复制
body: IndexedStack(
  index: _currentIndex,
  children: _pages,
),

📌 切换页面不会重建 widget → 页面状态保持


三、TabBar 与 BottomNavigationBar 对比

组件

适用场景

特点

TabBar

顶部标签页

通常配合 AppBar / TabBarView

BottomNavigationBar

底部导航

页面多且切换,保持状态建议用 IndexedStack

📌 结合使用也很常见:

  • 顶部 TabBar → 分类切换
  • 底部 BottomNavigationBar → 主模块切换

四、完整示例:底部 + 顶部结合

代码语言:javascript
复制
class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  int _currentIndex = 0;

  final List<Widget> _pages = [
    DefaultTabController(
      length: 2,
      child: Scaffold(
        appBar: AppBar(
          title: Text('首页'),
          bottom: TabBar(
            tabs: [Tab(text: '推荐'), Tab(text: '最新')],
          ),
        ),
        body: TabBarView(
          children: [
            Center(child: Text('推荐内容')),
            Center(child: Text('最新内容')),
          ],
        ),
      ),
    ),
    Center(child: Text('消息页')),
    Center(child: Text('我的页')),
  ];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: IndexedStack(
        index: _currentIndex,
        children: _pages,
      ),
      bottomNavigationBar: BottomNavigationBar(
        currentIndex: _currentIndex,
        onTap: (index) {
          setState(() {
            _currentIndex = index;
          });
        },
        items: [
          BottomNavigationBarItem(icon: Icon(Icons.home), label: '首页'),
          BottomNavigationBarItem(icon: Icon(Icons.message), label: '消息'),
          BottomNavigationBarItem(icon: Icon(Icons.person), label: '我的'),
        ],
      ),
    );
  }
}

📌 功能总结:

  • 底部导航切换模块
  • 首页模块内部 TabBar 切换分类
  • 使用 IndexedStack 保持状态

五、常见坑

❌ BottomNavigationBar 切换时页面被重建 → 状态丢失 ❌ TabBar 未用 DefaultTabController → 无法切换 ❌ body / TabBarView 内容与 tabs 数量不匹配 → 报错 ❌ 使用 StatefulWidget 嵌套时未注意 key → 状态错乱


六、本篇你真正掌握了什么?

你已经学会:

  • TabBar 顶部标签页
  • BottomNavigationBar 底部导航
  • 多页面切换与状态保持
  • TabBar + BottomNavigationBar 组合
  • 构建多模块 App 框架

📌 到这里为止:

你的 Flutter App 已经具备完整的多页面框架能力


七、一句话总结

TabBar 顶部切分类 BottomNavigationBar 底部切模块 IndexedStack 保持页面状态 多页面 App 架构完成


🔜 下一篇预告

《Flutter 零基础入门(四十一):Flutter 主题与自定义样式 —— App 美化必学》

下一篇我们将学习:

  • App 全局主题 ThemeData
  • 自定义颜色 / 字体 / 按钮样式
  • 统一美化整个 App

🚀 让你的 App 不再“丑丑的”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-02-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Larry的Hub 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • TabBar 与底部导航栏 —— 多页面切换与布局技巧
    • 一、TabBar 基础
      • 1️⃣ 基本结构
      • 2️⃣ TabBar 样式自定义
    • 二、BottomNavigationBar 基础
      • 1️⃣ 基本用法
      • 2️⃣ 状态保持
    • 三、TabBar 与 BottomNavigationBar 对比
    • 四、完整示例:底部 + 顶部结合
    • 五、常见坑
    • 六、本篇你真正掌握了什么?
    • 七、一句话总结
    • 🔜 下一篇预告
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档