尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

07-Flutter鸿蒙页面开发基础:路由、底部导航和常用组件

07-Flutter鸿蒙页面开发基础:路由、底部导航和常用组件
📅 发布时间:2026/7/12 19:20:44

07. Flutter鸿蒙页面开发基础:路由、底部导航和常用组件

项目跑起来后,就可以开始写 Flutter 页面。入门阶段不需要马上引入复杂状态管理,先把入口、页面拆分、底部导航、列表、详情页和通用组件写清楚,就能支撑大多数小型业务页面。

页面目录

推荐目录:

lib ├─ main.dart ├─ app.dart ├─ pages │ ├─ home_page.dart │ ├─ list_page.dart │ ├─ detail_page.dart │ └─ profile_page.dart └─ widgets └─ feature_card.dart

App 入口

import'package:flutter/material.dart';import'pages/home_page.dart';voidmain(){runApp(constDemoApp());}classDemoAppextendsStatelessWidget{constDemoApp({super.key});@overrideWidgetbuild(BuildContextcontext){returnMaterialApp(debugShowCheckedModeBanner:false,title:'Flutter Ohos Demo',theme:ThemeData(colorSchemeSeed:Colors.blue,useMaterial3:true,),home:constHomePage(),);}}

底部导航

classHomePageextendsStatefulWidget{constHomePage({super.key});@overrideState<HomePage>createState()=>_HomePageState();}class_HomePageStateextendsState<HomePage>{int _index=0;finalList<Widget>_pages=const[Center(child:Text('首页')),Center(child:Text('列表')),Center(child:Text('我的')),];@overrideWidgetbuild(BuildContextcontext){returnScaffold(body:_pages[_index],bottomNavigationBar:NavigationBar(selectedIndex:_index,onDestinationSelected:(value){setState(()=>_index=value);},destinations:const[NavigationDestination(icon:Icon(Icons.home_outlined),label:'首页'),NavigationDestination(icon:Icon(Icons.list_alt),label:'列表'),NavigationDestination(icon:Icon(Icons.person_outline),label:'我的'),],),);}}

列表与详情

classDemoListPageextendsStatelessWidget{constDemoListPage({super.key});@overrideWidgetbuild(BuildContextcontext){finalitems=List.generate(20,(index)=>'第${index+1}条内容');returnListView.separated(padding:constEdgeInsets.all(16),itemCount:items.length,separatorBuilder:(_,__)=>constSizedBox(height:10),itemBuilder:(context,index){returnListTile(shape:RoundedRectangleBorder(borderRadius:BorderRadius.circular(12)),tileColor:Colors.blue.withOpacity(0.08),title:Text(items[index]),trailing:constIcon(Icons.chevron_right),onTap:(){Navigator.of(context).push(MaterialPageRoute(builder:(_)=>DetailPage(title:items[index]),),);},);},);}}classDetailPageextendsStatelessWidget{finalStringtitle;constDetailPage({super.key,requiredthis.title});@overrideWidgetbuild(BuildContextcontext){returnScaffold(appBar:AppBar(title:Text(title)),body:Center(child:Text('详情内容:$title')),);}}

组件拆分

页面稳定后,把重复 UI 抽成组件:

classFeatureCardextendsStatelessWidget{finalIconDataicon;finalStringtitle;finalStringdesc;finalVoidCallback?onTap;constFeatureCard({super.key,requiredthis.icon,requiredthis.title,requiredthis.desc,this.onTap,});@overrideWidgetbuild(BuildContextcontext){returnInkWell(borderRadius:BorderRadius.circular(14),onTap:onTap,child:Container(padding:constEdgeInsets.all(16),decoration:BoxDecoration(color:Colors.white,borderRadius:BorderRadius.circular(14),border:Border.all(color:Colors.black12),),child:Row(children:[Icon(icon,size:32,color:Colors.blue),constSizedBox(width:12),Expanded(child:Column(crossAxisAlignment:CrossAxisAlignment.start,children:[Text(title,style:constTextStyle(fontSize:17,fontWeight:FontWeight.w600)),constSizedBox(height:4),Text(desc,style:constTextStyle(color:Colors.black54)),],),),],),),);}}

页面状态不要散落在多个地方

页面简单时可以用setState,但状态变量要集中管理。例如底部导航只维护一个_index,列表页只维护自己的加载状态。不要在父页面和子页面里同时维护相同状态,否则刷新时容易不一致。

classPageState<T>{finalbool loading;finalT?data;finalObject?error;constPageState({this.loading=false,this.data,this.error,});}

这个小类可以让页面状态更清楚:加载中、成功、失败分别对应不同字段。

页面尺寸适配

鸿蒙设备可能有不同尺寸,布局时尽量少写死宽度。优先使用:

LayoutBuilder(builder:(context,constraints){finalcompact=constraints.maxWidth<420;returnPadding(padding:EdgeInsets.all(compact?12:20),child:constText('自适应内容'),);},)

这样页面在手机、折叠屏或平板场景下更容易继续扩展。
(context, constraints) {
final compact = constraints.maxWidth < 420;
return Padding(
padding: EdgeInsets.all(compact ? 12 : 20),
child: const Text(‘自适应内容’),
);
},
)

这样页面在手机、折叠屏或平板场景下更容易继续扩展。

相关新闻

  • AD5593R与MK20DN128VFM5混合信号处理实战指南
  • AI应用的可观测性:LLM调用的全链路追踪与异常诊断平台
  • Spekt8核心功能揭秘:Pod状态监控、服务依赖分析与资源消耗统计

最新新闻

  • Kubernetes新手必备:使用Spekt8直观理解Pod、Service与Ingress关系
  • BurpSuite 插件迁移实战:Windows 环境 3 步完成配置同步与 Python 插件修复
  • 日常工作哪家表格工具好用?2026年实用选型参考 - 品牌测评鉴赏家
  • 私藏三个宝藏网站,每个都让人上头
  • 【Agent工程化生死线】:为什么87%的AI应用在工具调用环节崩溃?3个被低估的协议级缺陷+2套已验证的容错架构
  • 重庆欧米茄回收价格查询及靠谱平台实测排行(2026年7月最新数据) - 天价名表回收平台

日新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号