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

鸿蒙原生应用实战(一):Stage模型项目搭建与页面架构设计

鸿蒙原生应用实战(一):Stage模型项目搭建与页面架构设计

系列目录:

  • 第一篇:项目搭建与页面架构设计 ← 当前
  • 第二篇:首页开发与全局数据流设计
  • 第三篇:笔记详情与编辑页面的路由与CRUD
  • 第四篇:分类浏览与个人中心的多维数据展示
  • 第五篇:构建调试、异常处理与HAP发布

一、前言

HarmonyOS 6.1(API 23)引入了更成熟的 Stage 模型和 ArkTS 声明式 UI 框架。本系列将从一个完整项目——「知识笔记」个人知识管理 App 的实战开发出发,带你从零搭建一个多页面、可交互的鸿蒙原生应用。

最终效果:一个包含首页笔记列表、笔记详情、编辑笔记、分类浏览、个人中心 5 个页面的完整 App。

二、项目环境与SDK配置

2.1 开发环境

DevEco Studio: 最新版本 SDK: API 23 (compatibleSdkVersion 23, targetSdkVersion 24) 框架: Stage 模型 + ArkTS 模拟器: Emulator 6.1.0.115

2.2 创建项目

打开 DevEco Studio → 新建项目 → 选择Empty Ability模板 → Stage 模型 → ArkTS 语言。

2.3 理解SDK版本配置

创建完成后,根目录下的build-profile.json5控制 SDK 版本:

{ "app": { "products": [ { "name": "default", "targetSdkVersion": "6.1.1(24)", "compatibleSdkVersion": "6.1.0(23)", "runtimeOS": "HarmonyOS" } ] } }

这里compatibleSdkVersion设为 23,表示应用兼容 API 23,而targetSdkVersion为 24 表示在 API 24 上测试过。我们不需要改动这个配置。

三、项目结构概览

创建后的项目结构:

MyApplication/ ├── AppScope/ # 全局配置 │ ├── app.json5 # 应用级配置(bundleName、版本号等) │ └── resources/ │ └── base/element/string.json # 全局字符串资源(app_name) ├── entry/ # 应用入口模块 │ ├── build-profile.json5 # 模块构建配置 │ ├── src/main/ │ │ ├── ets/ │ │ │ ├── entryability/ # Ability 生命周期 │ │ │ └── pages/ # 页面目录 ← 我们的核心代码 │ │ ├── module.json5 # 模块注册 │ │ └── resources/ # 资源文件 │ └── oh-package.json5 # 依赖配置 ├── hvigor/ # 构建工具配置 └── build-profile.json5 # 项目级构建配置

3.1 路由注册

页面路由通过main_pages.json注册:

{"src":["pages/Index","pages/NotePage","pages/EditPage","pages/CategoryPage","pages/ProfilePage"]}

这个文件位于entry/src/main/resources/base/profile/main_pages.json。每个页面路径对应pages/下的一个.ets文件。

3.2 Ability 入口

module.json5中注册的EntryAbility是应用入口,它通过loadContent加载首页:

// entryability/EntryAbility.etsonWindowStageCreate(windowStage:window.WindowStage):void{windowStage.loadContent('pages/Index',(err)=>{if(err.code){hilog.error(DOMAIN,'testTag','Failed to load content: %{public}s',JSON.stringify(err));}});}

四、页面架构设计

4.1 五页面导航结构

我们设计的「知识笔记」App 有 5 个页面,底部导航栏提供三个主要入口:

┌─────────────────────────────────────┐ │ 首页 (Index.ets) │ │ ┌─ 顶部标题栏 ── 头像 ─┐ │ │ │ 搜索栏 │ │ │ │ [全部] [工作] [学习] ..│ │ │ ├──────────────────────┤ │ │ │ 笔记卡片 1 │ │ │ │ 笔记卡片 2 │ │ │ │ 笔记卡片 3 │ │ │ │ ... │ │ │ └──────────────────────┘ │ │ [笔记] [分类] [我的] ← 底部导航│ │ ⊕ 悬浮新建按钮 │ └─────────────────────────────────────┘

页面间关系:

页面路由URL功能数据依赖
Indexpages/Index笔记列表首页AppStorage 全局数据
NotePagepages/NotePage查看笔记详情路由参数 noteId
EditPagepages/EditPage新建/编辑笔记可选路由参数 noteId
CategoryPagepages/CategoryPage分类浏览AppStorage 全局数据
ProfilePagepages/ProfilePage个人中心与统计AppStorage 全局数据

4.2 数据模型设计

所有页面共享同一个数据模型Note

interfaceNote{id:number;// 唯一标识title:string;// 笔记标题content:string;// 笔记正文category:string;// 分类:工作/学习/生活/灵感date:string;// 日期:YYYY-MM-DD}

全局状态通过AppStorage共享,以 JSON 字符串形式存储所有笔记:

letstored:string|undefined=AppStorage.get<string>('notes');letallNotes:Note[]=stored?JSON.parse(stored)asNote[]:[];

五、资源文件体系

鸿蒙的资源文件系统使用$r()语法引用,分三类:

5.1 颜色资源 (color.json)

{"color":[{"name":"start_window_background","value":"#FFFFFF"},{"name":"primary","value":"#007AFF"},{"name":"background","value":"#F5F5F5"},{"name":"card_bg","value":"#FFFFFF"},{"name":"text_primary","value":"#1A1A1A"},{"name":"text_secondary","value":"#666666"},{"name":"delete_red","value":"#FF3B30"}]}

5.2 尺寸资源 (float.json)

{"float":[{"name":"title_font_size","value":"24fp"},{"name":"body_font_size","value":"16fp"},{"name":"card_radius","value":"12vp"},{"name":"page_padding","value":"16vp"}]}

5.3 字符串资源 (string.json)

项目中两个 string.json 的职责要分清:

  • AppScope/resources/base/element/string.json: 只放app_name
  • entry/src/main/resources/base/element/string.json: 放所有页面级字符串

重要警告app_name不能在两处同时定义!否则构建时会报'app_name' conflict错误。

六、第一篇总结

本篇我们完成了:

  1. ✅ 创建鸿蒙 Stage 模型项目并理解 SDK 版本配置
  2. ✅ 规划 5 个页面的路由架构和页面关系
  3. ✅ 设计数据模型 Note 和全局状态方案
  4. ✅ 搭建资源文件体系(颜色、字体、字符串)

下一篇将进入核心开发——首页的笔记列表、搜索、分类筛选和悬浮按钮实现,以及全局数据流的完整设计。


http://www.zskr.cn/news/1499493.html

相关文章:

  • 防爆AP怎么选?一文读懂选型要点+合规标准
  • JavaScript/TypeScript为何成为TVA的“交互皮肤”(5)
  • 上海出手爱彼手表避坑攻略:警惕虚高报价引流、到店压价等套路 - 奢侈品回收评测
  • Web分布式网站架构之-Squid缓存【20260608】004篇-【传统代理】
  • 第一讲:C语言的常见概念
  • 分公司越来越多,网络越用越卡?教你用“智能网关”把企业专线成本砍掉50%
  • YOLOv5 实战:不修改 `detect.py`,让检测结果图中的置信度随机显示为自己想要的
  • 零基础玩转大数据!800万条浏览器行为数据ETL实战,从零搞定可视化大屏底层数据
  • 2026年 膜分离设备厂家推荐:辽宁膜分离工艺与管式膜分离系统,青花椒油分离/食品级膜分离/医药膜分离技术优选指南 - 品牌发掘
  • 多 Agent 协作的“终极难题”:如何解决冲突、分歧与无限循环?
  • 清理重复文件释放C盘空间的工具
  • Web分布式网站架构之-Squid缓存【20260609】squid配置文件详解001篇
  • 网络请求基础:使用http模块发起GET/POST请求(12)
  • 全固态电池技术路线解析,硫化物、氧化物、聚合物谁主沉浮?
  • 深圳卡地亚回收避坑要点|先查资质、再看报价、最后结算 - 奢侈品回收测评
  • 【Azure AI Search】 searchMode=any 和 searchMode=all 有什么区别?
  • SQL/NoSQL数据库为何成为TVA的记忆系统(8)
  • 模型训练为什么一上 Pipeline Parallel 就开始显存更稳却气泡时间更难压:从 Stage Balance 到 Bubble Budget 的工程实战
  • 《多语言高并发巅峰对决:Python vs Java vs C++ 10万级QPS架构决策完全指南》第6章 序列化与协议瓶颈:JSON/Protobuf/Thrift/MessagePack在高压下的
  • 2026武汉名表回收实测——高端腕表变现避坑干货指南 - 奢侈品回收测评
  • 石材安装后不满意能退吗?消费者权益保护全解析(2026版) - 宁波融诚石业
  • 2026网盘隐私大测评!哪家文件加密最靠谱?高安全网盘横向盘点
  • 东芝原色RGB Mini LED(Evo):四色架构重构显示边界
  • 个人总结 docker搭建家庭媒体库Jellyfin
  • 石材色差是正常的吗?国家标准+验收红线全知道(2026版) - 宁波融诚石业
  • 宁波梅雨季装修石材防护专题:6-9月施工注意事项(2026版) - 宁波融诚石业
  • HTML5语义化与无障碍实践:构建面向未来的Web基石
  • 别再为乱码头疼了!SOLIDWORKS工程图转DWG字体设置保姆级教程(附drawfontmap.txt修改指南)
  • 警惕 “高价回收” 幌子:昆明包包回收真实利润与报价底线 - 奢侈品回收评测
  • 图片批量翻译工具测评:功能、价格与适用场景分析