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

发布时间:2026/7/12 19:15:12

07-Flutter鸿蒙页面开发基础:路由、底部导航和常用组件
07. Flutter鸿蒙页面开发基础路由、底部导航和常用组件项目跑起来后就可以开始写 Flutter 页面。入门阶段不需要马上引入复杂状态管理先把入口、页面拆分、底部导航、列表、详情页和通用组件写清楚就能支撑大多数小型业务页面。页面目录推荐目录lib ├─ main.dart ├─ app.dart ├─ pages │ ├─ home_page.dart │ ├─ list_page.dart │ ├─ detail_page.dart │ └─ profile_page.dart └─ widgets └─ feature_card.dartApp 入口importpackage:flutter/material.dart;importpages/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});overrideStateHomePagecreateState()_HomePageState();}class_HomePageStateextendsStateHomePage{int _index0;finalListWidget_pagesconst[Center(child:Text(首页)),Center(child:Text(列表)),Center(child:Text(我的)),];overrideWidgetbuild(BuildContextcontext){returnScaffold(body:_pages[_index],bottomNavigationBar:NavigationBar(selectedIndex:_index,onDestinationSelected:(value){setState(()_indexvalue);},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){finalitemsList.generate(20,(index)第${index1}条内容);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列表页只维护自己的加载状态。不要在父页面和子页面里同时维护相同状态否则刷新时容易不一致。classPageStateT{finalbool loading;finalT?data;finalObject?error;constPageState({this.loadingfalse,this.data,this.error,});}这个小类可以让页面状态更清楚加载中、成功、失败分别对应不同字段。页面尺寸适配鸿蒙设备可能有不同尺寸布局时尽量少写死宽度。优先使用LayoutBuilder(builder:(context,constraints){finalcompactconstraints.maxWidth420;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(‘自适应内容’),);},)这样页面在手机、折叠屏或平板场景下更容易继续扩展。

相关新闻

如何解决React Native Text Input Mask常见问题:兼容性、性能优化与测试策略终极指南

如何解决React Native Text Input Mask常见问题:兼容性、性能优化与测试策略终极指南

2026/7/12 19:15:12

如何解决React Native Text Input Mask常见问题:兼容性、性能优化与测试策略终极指南 【免费下载链接】react-native-text-input-mask Text input mask for React Native, Android and iOS 项目地址: https://gitcode.com/gh_mirrors/re/react-native-text-input-…

Neural Scene Flow Fields源代码深度剖析:从光流估计到神经辐射场构建

Neural Scene Flow Fields源代码深度剖析:从光流估计到神经辐射场构建

2026/7/12 19:15:12

Neural Scene Flow Fields源代码深度剖析:从光流估计到神经辐射场构建 【免费下载链接】Neural-Scene-Flow-Fields PyTorch implementation of paper "Neural Scene Flow Fields for Space-Time View Synthesis of Dynamic Scenes" 项目地址: https://g…

Saucer多后端支持深度测评:Windows WebView2 vs Linux WebKitGtk vs macOS WKWebView

Saucer多后端支持深度测评:Windows WebView2 vs Linux WebKitGtk vs macOS WKWebView

2026/7/12 19:15:12

Saucer多后端支持深度测评:Windows WebView2 vs Linux WebKitGtk vs macOS WKWebView 【免费下载链接】saucer 🛸 A modern, cross-platform C webview library 项目地址: https://gitcode.com/gh_mirrors/sa/saucer Saucer作为一款现代化的跨平台…

【Day 1】中小企业云服务器选购与初始化完整实操指南(2026版)

【Day 1】中小企业云服务器选购与初始化完整实操指南(2026版)

2026/7/12 23:05:22

系列:《中小企业云服务器7天运维实战》Day 1/7 标签:云服务器 | ECS | 运维入门 | 宝塔面板 | 建站 发布时间:2026-06-14 阅读时长:12分钟 适用版本:CentOS 7.9 / Ubuntu 22.04 LTS / 阿里云ECS 摘要 本文是《中小企业…

滴油上色设备深度测评:半年实测全自动滴油机的真实表现

滴油上色设备深度测评:半年实测全自动滴油机的真实表现

2026/7/12 23:05:22

一、写在前面入行做滴油上色这块五年了,从最开始手工滴油,到后来试过各种设备,说实话踩的坑不少。前阵子跟几个同行聊天,发现大家关心的问题其实都差不多——上色均匀度、效率、还有设备稳定性。今天就把我这半年的真实体感&#…

Redux-cycles与Redux-saga对比:函数式响应式编程如何简化复杂异步逻辑

Redux-cycles与Redux-saga对比:函数式响应式编程如何简化复杂异步逻辑

2026/7/12 23:05:22

Redux-cycles与Redux-saga对比:函数式响应式编程如何简化复杂异步逻辑 【免费下载链接】redux-cycles Bring functional reactive programming to Redux using Cycle.js 项目地址: https://gitcode.com/gh_mirrors/re/redux-cycles Redux-cycles是一个将Cycl…

TypeScript在React项目中的实战应用:Kent C. Dodds代码示例详解

TypeScript在React项目中的实战应用:Kent C. Dodds代码示例详解

2026/7/12 23:05:22

TypeScript在React项目中的实战应用:Kent C. Dodds代码示例详解 【免费下载链接】old-kentcdodds.com Kents Homepage 项目地址: https://gitcode.com/gh_mirrors/ol/old-kentcdodds.com TypeScript与React的结合能显著提升代码质量和开发效率。本文将通过Ke…

Edalize模板引擎揭秘:Jinja2在EDA工具配置中的高级应用

Edalize模板引擎揭秘:Jinja2在EDA工具配置中的高级应用

2026/7/12 23:05:22

Edalize模板引擎揭秘:Jinja2在EDA工具配置中的高级应用 【免费下载链接】edalize An abstraction library for interfacing EDA tools 项目地址: https://gitcode.com/gh_mirrors/ed/edalize Edalize作为一款抽象库,为EDA工具提供了强大的接口能力…

用户调研问卷正在失效?——2024年头部企业已启用ChatGPT动态问卷引擎(限时开放3套私有化Prompt库)

用户调研问卷正在失效?——2024年头部企业已启用ChatGPT动态问卷引擎(限时开放3套私有化Prompt库)

2026/7/12 22:55:22

更多请点击: https://intelliparadigm.com 第一章:用户调研问卷正在失效?——2024年头部企业已启用ChatGPT动态问卷引擎(限时开放3套私有化Prompt库) 传统静态问卷正遭遇信任危机:2024年Q1《用户体验研究白…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践

2026/7/12 0:03:42

Unity游戏文本翻译架构深度解析:XUnity.AutoTranslator的技术实现与工程实践 【免费下载链接】XUnity.AutoTranslator 项目地址: https://gitcode.com/gh_mirrors/xu/XUnity.AutoTranslator XUnity.AutoTranslator作为Unity游戏社区中最成熟的文本翻译解决方…

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持

2026/7/12 0:03:42

openEuler Raspberry Pi Kernel设备驱动开发指南:为树莓派硬件添加支持 【免费下载链接】raspberrypi-kernel It provides openEuler kernel source for Raspberry Pi 项目地址: https://gitcode.com/openeuler/raspberrypi-kernel 前往项目官网免费下载&…

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧

2026/7/12 0:03:42

openEuler系统集成测试实战:基于smoke-test套件的环境验证技巧 【免费下载链接】integration-test The repo contains test suits for system integration test 项目地址: https://gitcode.com/openeuler/integration-test 前往项目官网免费下载:…