Flutter for OpenHarmony 实战之基础组件:第十一篇 BottomNavigationBar 与 TabBar 多页切换

Flutter for OpenHarmony 实战之基础组件:第十一篇 BottomNavigationBar 与 TabBar 多页切换
在这里插入图片描述

Flutter for OpenHarmony 实战之基础组件:第十一篇 BottomNavigationBar 与 TabBar 多页切换

摘要:一个复杂的 App 通常包含多个功能模块。本文将深入讲解 Flutter 中最核心的两种多页切换模式:底部导航 (BottomNavigationBar) 和顶部选项卡 (TabBar)。我们将探讨 Material 3 风格的新组件 NavigationBar,解决页面切换时的状态丢失问题,并适配鸿蒙系统的底部手势条。

前言

打开你手机里的微信、淘宝或抖音,你会发现它们都有一个共同的架构:底部有 4-5 个图标,点击切换不同的主页面;顶部可能还有“关注/推荐/热榜”这样的分类切换。

这就是移动端最经典的 “底 Tab + 顶 Tab” 双导航架构。

本文你将学到

  • BottomNavigationBar (经典) 与 NavigationBar (Material 3) 的区别
  • TabBar + TabBarView 实现滑动切换
  • 核心难点:如何让页面在切换后不重置?(AutomaticKeepAliveClientMixin)
  • 鸿蒙适配:底部导航栏如何避开系统手势条 (Home Indicator)

一、底部导航:App 的根基

Flutter 提供了两种主流的底部导航组件。

在这里插入图片描述

1.1 经典款:BottomNavigationBar

这是最传统、兼容性最好的组件。

classMainPageextendsStatefulWidget{constMainPage({super.key});@overrideState<MainPage>createState()=>_MainPageState();}class _MainPageState extendsState<MainPage>{ int _currentIndex =0;// 页面列表finalList<Widget> _pages =[constHomePage(),constCategoryPage(),constProfilePage(),];@overrideWidgetbuild(BuildContext context){returnScaffold( body: _pages[_currentIndex],// 根据下标显示对应页面 bottomNavigationBar:BottomNavigationBar( currentIndex: _currentIndex, onTap:(index)=>setState(()=> _currentIndex = index), type:BottomNavigationBarType.fixed,// 超过3个item必须设置fixed selectedItemColor:Colors.blue, unselectedItemColor:Colors.grey, items:const[BottomNavigationBarItem(icon:Icon(Icons.home), label:'首页'),BottomNavigationBarItem(icon:Icon(Icons.category), label:'发现'),BottomNavigationBarItem(icon:Icon(Icons.person), label:'我的'),],),);}}

1.2 新潮款:NavigationBar (M3)

Material 3 引入了更高、更圆润的 NavigationBar。它自带点击涟漪和胶囊状的指示器,视觉效果更好。

NavigationBar( selectedIndex: _currentIndex, onDestinationSelected:(index)=>setState(()=> _currentIndex = index), destinations:const[NavigationDestination( icon:Icon(Icons.home_outlined), selectedIcon:Icon(Icons.home), label:'首页',),NavigationDestination( icon:Icon(Icons.explore_outlined), selectedIcon:Icon(Icons.explore), label:'发现',),// ...],)

二、顶部选项卡:TabBar

TabBar 通常用于在同一个主栏目下,切换不同的子分类(如新闻 App 的频道)。它必须配合 TabController 使用。

在这里插入图片描述

2.1 DefaultTabController (推荐)

最简单的方法是在父级包裹一个 DefaultTabController,这样我们就不用手动管理 Controller 了。

classNewsPageextendsStatelessWidget{constNewsPage({super.key});@overrideWidgetbuild(BuildContext context){returnDefaultTabController( length:3,// Tab 数量 child:Scaffold( appBar:AppBar( title:constText('资讯'), bottom:constTabBar( tabs:[Tab(text:'推荐'),Tab(text:'科技'),Tab(text:'体育'),],),), body:constTabBarView( children:[Center(child:Text('推荐内容列表')),Center(child:Text('科技内容列表')),Center(child:Text('体育内容列表')),],),),);}}

三、核心难点:页面状态保持

在这里插入图片描述

默认情况下,当你从“首页”切换到“我的”,再切回“首页”时,首页会被重建(列表滚动位置丢失,输入框清空)。这是因为 Scaffold.body 直接替换了 Widget。

3.1 解决方案:IndexedStack

如果你希望所有页面在初始化后一直存在,可以使用 IndexedStack。它会一次性加载所有页面(注意内存消耗)。

// 修改 Scaffold body body:IndexedStack( index: _currentIndex, children: _pages,// 所有页面都会被保留在 Widget 树中,只是不可见),

3.2 解决方案:AutomaticKeepAliveClientMixin

如果你使用的是 PageViewTabBarView,更推荐让子页面自己决定是否保持状态。

classHomePageextendsStatefulWidget{constHomePage({super.key});@overrideState<HomePage>createState()=>_HomePageState();}// 1. 混入 AutomaticKeepAliveClientMixinclass _HomePageState extendsState<HomePage>withAutomaticKeepAliveClientMixin{// 2. 重写 wantKeepAlive 返回 true@override bool get wantKeepAlive =>true;@overrideWidgetbuild(BuildContext context){super.build(context);// 3. 必须调用 super.buildreturnListView.builder( itemCount:100, itemBuilder:(c, i)=>ListTile(title:Text('Item $i')),);}}

四、OpenHarmony 鸿蒙适配专题

在这里插入图片描述

4.1 底部导航栏与手势条

现在的鸿蒙手机(如 Mate 60)默认开启全面屏手势,底部有一条“黑条”或“白条” (Home Indicator)。

如果你的 BottomNavigationBar 高度写死,或者没有适配 SafeArea,底部的图标可能会被这个手势条遮挡。

Flutter 的 Scaffold + BottomNavigationBar 默认已经处理了 SafeArea。但如果你使用了自定义的底部栏(比如 Stack 里的 Positioned),务必包裹 SafeArea 并设置 bottom: true

Align( alignment:Alignment.bottomCenter, child:SafeArea( child:Container( height:60, color:Colors.white, child:Row(...),),),)

五、总结

搭建一个 App 的骨架,核心就是“一底一顶”。

核心要点

  1. 底部导航:推荐使用 M3 风格的 NavigationBar,视觉更现代。
  2. 顶部 Tab:使用 DefaultTabController 配合 TabBarView 最省事。
  3. 状态保持:不想每次切换都重加载?请记住 IndexedStack (简单粗暴) 或 AutomaticKeepAliveClientMixin (精细控制)。
  4. 鸿蒙适配:时刻留意底部的安全区域,不要让按钮贴底太近。

下一篇预告

基本的页面结构都有了,但是我们现在的布局还是太“循规蹈矩”了(一行一列)。如果我要做一个 Pinterest 那样的瀑布流,或者像相册一样的网格呢?
《Flutter for OpenHarmony 实战之基础组件:第十二篇 GridView 网格布局详解》
我们将突破线性布局的限制,探索二维空间的布局艺术。


🌐 欢迎加入开源鸿蒙跨平台社区开源鸿蒙跨平台开发者社区

Read more

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

顶级AI大模型白嫖ChatGPT Plus1个月,0成本薅顶配功能

谁懂啊!原价每月20美元的ChatPlus,现在居然能免费薅满1个月*!GPT-5智能回复、Sora做视频、Codex写代码这些“钞能力”功能,直接全解锁——这波羊毛不薅,真的亏到拍大腿! 打开GPT首页 这波福利到底有多香?看界面直接馋哭 先放活动截图感受下:原本20美元/月的Plus,现在首月直接标0美元,还贴了“特别优惠”标签👇 光看功能列表就赚翻了: * 用GPT-5解复杂问题、聊长对话 * Sora直接做视频+分享 * Codex写代码/搭应用 * 自定义GPT、记对话历史、代理模式规划任务 等于花0美元,把ChatGPT的“顶配权限”直接拉满! 亲测有效!免费订阅全流程(5步搞定) 话不多说,直接上实操步骤,跟着走1分钟搞定: 1. **进入首页 2. 点击免费赠品 3. 点“获取Plus”进入付款页

OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相

OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相

🔥 个人主页:杨利杰YJlio❄️ 个人专栏:《Sysinternals实战教程》《Windows PowerShell 实战》《WINDOWS教程》《IOS教程》《微信助手》《锤子助手》《Python》《Kali Linux》《那些年未解决的Windows疑难杂症》🌟 让复杂的事情更简单,让重复的工作自动化 OpenClaw 为什么突然爆火?从上门安装到排队体验,我看到的 AI Agent 破圈真相 * 1、OpenClaw 这次为什么让我有点震撼? * 2、OpenClaw 到底是什么?它和普通聊天 AI 有什么不同? * 2.1 普通大模型解决的是“回答问题” * 2.2 OpenClaw 这类 Agent 试图解决的是“帮我完成任务” * 3、从控制台截图看,它已经不是“纯概念”了 * 4、

OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战

OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战

OpenClaw深度解析:“数字龙虾”何以引爆AI Agent时代?安全危机与未来之战 一只“龙虾”,正在搅动整个科技圈。 2026年3月,一款名为OpenClaw的开源AI智能体框架在中国科技圈引发了一场前所未有的“全民养虾热”。它的GitHub星标数突破27万,超越React和Linux登顶全球开源软件项目榜。黄仁勋在GTC 2026上高呼:“这是Agent时代的Windows,每个公司都需要有OpenClaw战略”。 但与此同时,中国互联网金融协会、工信部、国家互联网应急中心接连发布安全预警。有用户因AI幻觉痛失全部邮件,有企业因恶意技能被植入后门。 这只“数字龙虾”究竟是什么?它为何能掀起滔天巨浪?又将游向何方? 01 现象:OpenClaw引爆的“龙虾热” 2026年春天,科技圈最火的关键词无疑是OpenClaw。这款开源自动化智能体框架,让大语言模型第一次真正长出了能干活儿的“钳子”。 核心能力:从“会说话”到“会做事” 与传统对话式AI不同,OpenClaw能够直接操作浏览器、读取文件、调用API、运行脚本,甚至接入微信、飞书、钉钉等协作平台。

从指令到执行:OpenClaw 底层原理深度拆解 —— 一台真正会 “动手” 的本地 AI 引擎

从指令到执行:OpenClaw 底层原理深度拆解 —— 一台真正会 “动手” 的本地 AI 引擎

前言 当我们对 OpenClaw 发出一句自然语言指令:“把桌面所有超过一周的截图归档到 D 盘,再把今天的工作记录整理成 Markdown 并推送到 GitHub。” 传统 AI 会给出步骤,而 OpenClaw 会直接做完。 绝大多数文章只告诉你 OpenClaw “能做什么”,却极少解释它到底是如何做到的: * 一段文字,是怎么变成可执行的系统操作? * 它凭什么能跨 IM、跨平台、跨模型统一工作? * 高权限执行,底层是如何保证安全与可控? * 本地运行、隐私闭环,在架构上究竟如何实现? 本文不讲功能、不讲教程,只讲原理。从意图解析、任务编排、执行引擎、权限沙箱到多模态交互,带你从 0 到 1 理解 OpenClaw 的技术本质:它不是一个聊天机器人,而是一套本地优先、可解释、可审计、