当前位置: 首页 > news >正文

21天学会OpenHarmony跨平台开发 - windows + Flutter【Day8】

昨天把底部导航栏外观完成了,但是点击还不能切换,今天把点击功能添加上,并且完善浏览区。

BottomNavigationBar 组件自带 onTap 方法并自动传入当前点击的 index,需要定义一个存放导航栏按钮索引的变量,在无状态类中添加变量、补充onTap方法即可:

class _MainPageState extends State<MainPage> { // 本节关键代码 // 存放点击索引 int _currentIndex = 0; // 底部导航条定义好了基本不会变,所以声明 final final List<TabListItem> _tabList = [ TabListItem( icon: Icon(Icons.home, color: Colors.grey), activeIcon: Icon(Icons.home, color: Colors.black), text: "首页" ), TabListItem( icon: Icon(Icons.shopping_cart, color: Colors.grey), activeIcon: Icon(Icons.shopping_cart, color: Colors.black), text: "购物车" ), TabListItem( icon: Icon(Icons.person, color: Colors.grey), activeIcon: Icon(Icons.person, color: Colors.black), text: "我的" ), ]; List<BottomNavigationBarItem> _getTabBarWidget() { return List.generate(_tabList.length, (int index) { return BottomNavigationBarItem( icon: _tabList[index].icon, activeIcon: _tabList[index].activeIcon, label: _tabList[index].text, ); }); } @override Widget build(BuildContext context) { return Scaffold( body: Center(child: Text("主页")), bottomNavigationBar: BottomNavigationBar( items: _getTabBarWidget(), // 本节关键代码 onTap: (int index) { _currentIndex = index; setState(() {}); }, currentIndex: _currentIndex, ), ); } }

接下来处理显示区域,显示区域都需要避开屏幕上方挖孔或者刘海,下方要显示内容要避开昨天做得导航栏,以便于完整显示。正好 Flutter 有自动处理这些问题的组件:SafeArea() 用于设置显示安全区域。另外,每个导航功能的页面是堆叠放置,每点击一个导航按钮,把堆叠的页面置顶就可以显示出来了,可以用一个组件处理堆叠:IndexedStack(),把 Scaffold() 下面的 body: Center() 组件替换为 SafeArea() 。

IndexedStack() 里面有一个 children:[] 属性,我们同样用函数来处理子 widget ;再把导航栏点击获取的 index 变量传过来赋值给 index 属性就可以控制页面堆叠显示了。

三个页面,组件比较多,来建立三个目录:Home,Cart,Info,每个目录下面建立 index.dart 每个页面都使用有状态组件,如下:

代码如下:

// 本节关键代码 List<Widget> _getChildren() { return [ HomeView(), CartView(), InfoView(), ]; } @override Widget build(BuildContext context) { return Scaffold( // 本节关键代码 body: SafeArea(child: IndexedStack( index: _currentIndex, // 配合点击传来的 index 变量 children: _getChildren(), )), bottomNavigationBar: BottomNavigationBar( items: _getTabBarWidget(), onTap: (int index) { _currentIndex = index; setState(() {}); }, currentIndex: _currentIndex, ), ); } }

点击导航栏,显示对应页面,完成效果:

http://www.cnnetsun.cn/news/50988.html

相关文章:

  • 快速验证:基于CentOS 7.6的测试环境搭建
  • AI定价实战指南:快速构建电商智能定价系统
  • VGGT三维重建终极指南:从零开始构建你的3D世界
  • 电商网站秒开秘籍:快马AI加载优化案例
  • 15分钟快速验证:谷歌服务离线包生成器原型开发
  • 1小时搞定ElementUI原型:快马平台实战
  • 从天喵装机案例看中小企业IT设备采购新范式
  • Flink面试题实战:从问题到解决方案
  • 5分钟用C# Socket搭建文件传输原型
  • 论文查重不花一分钱?宏智树AI开启学术诚信新“净”界!
  • 最强安卓投屏神器QtScrcpy
  • 开题报告“自造机”VS“人工苦力”:宏智树AI凭何成为学术起航新引擎?
  • 还在为SPSS代码头疼?5款AI数据分析工具实测:有的只能画图,有的却能直接嵌入论文全流程
  • 单环PID控制Buck电路实现方案
  • 零基础必学:CSS div居中完全指南(图文详解)
  • COCO数据集工具库完整使用指南:从入门到实战应用
  • c盘红了怎么清理c盘空间?
  • 传统排错vsAI诊断:503错误处理效率提升300%
  • 清理后空间为什么很快又满了?
  • 企业级应用中的SSL证书故障排查实战
  • GPT-OSS-Safeguard-20B:开源AI安全推理模型重构内容审核范式
  • LogicFlow自定义节点:5步打造个性化流程图组件
  • ESP8266引脚实战:从零搭建智能温湿度监测系统
  • 1小时快速构建IDM集成模块原型
  • Ubuntu中文输入法在企业办公环境中的实战部署
  • 快速原型设计:用AI即时生成带省略号的UI组件
  • 零基础入门:用Cursor免费版写出你的第一行代码
  • 零基础入门:用大模型开启AI学习之旅
  • 零基础图解MinGW安装:小学生都能看懂
  • 对比评测:5种Ubuntu中文输入法的输入效率差异