HarmonyOS应用开发快速入门(5):指令/export导出,指令/import导入,MVVM,页面的生命周期,resourceManager库,JSON库,HAP签名【重发】

发布时间:2026/9/15 16:29:47

HarmonyOS应用开发快速入门(5):指令/export导出,指令/import导入,MVVM,页面的生命周期,resourceManager库,JSON库,HAP签名【重发】 src/main/ets/pages/Index.etsimport { TutorialView } from ../view/TutorialView; import { Banner } from ../view/Banner; import { EnablementView } from ../view/EnablementView; Entry Component struct Index { // 结构/索引 State message: string 快速入门; // 变量/消息 build() { Column() { // 列方向铺展的对象 Text(this.message) .fontSize(24) // 字体大小 .fontWeight(700) // 笔画粗细 .width(100%) // 对象的容器的相对宽度 .textAlign(TextAlign.Start) // 对齐方式 .padding({ left: 16 }) // 对象的内部的左侧的填充 .fontFamily(HarmonyHeiTi-Bold) // 字体 .lineHeight(30) // 自上向下的行高 Scroll() { Column() { Banner() EnablementView() TutorialView() } } .layoutWeight(1) .scrollBar(BarState.Off) .align(Alignment.TopStart) } .height(100%) // 对象的容器的相对高度 .width(100%) .backgroundColor(#F1F3F5) // 背景色 } }src/main/ets/util/BufferUtil.etsimport { util } from kit.ArkTS; export function bufferToString(buffer: Uint8Array): string { let textDecoder util.TextDecoder.create(utf-8, { ignoreBOM: true }); let resultPut textDecoder.decodeToString(buffer); return resultPut; }src/main/ets/view/Banner.etsimport { BannerClass } from ../model/BannerClass; import { bufferToString } from ../util/BufferUtil; Preview Component export struct Banner { State bannerList: BannerClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(BannerData.json).then(value { let res: string bufferToString(value); this.bannerList JSON.parse(res) as BannerClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Swiper() { // 滑动和轮播的对象 ForEach(this.bannerList, (item: BannerClass, index: number) { Image($r(item.imageSrc)) .objectFit(ImageFit.Contain) // 图片的适配的方式 .width(100%) .padding({ top: 11, left: 16, right: 16 }) .borderRadius(16) }, (item: BannerClass, index: number) item.id) } .autoPlay(true) // 自动轮播 .loop(true) // 循环播放 .indicator( // 指示器 new DotIndicator() // 点状指示器 .color(#1a000000) // 颜色 .selectedColor(#0A59F7) // 选中的颜色 ) } }src/main/ets/view/EnablementView.etsimport { ArticleClass } from ../model/ArticleClass; import { bufferToString } from ../util/BufferUtil; // Preview Component struct EnablementItem { Prop enablementItem: ArticleClass; // 接收数据 build() { Column() { Image($r(this.enablementItem.imageSrc)) .width(100%) .objectFit(ImageFit.Cover) .height(96) // 绝对高度拉伸图片 .borderRadius({ // 左上角和右上角圆角 topLeft: 16, topRight: 16 }) Text(this.enablementItem.title) .height(19) .width(100%) .fontSize(14) .textAlign(TextAlign.Start) // 文本对齐 .textOverflow({ overflow: TextOverflow.Ellipsis }) // 文本溢出的处理方式 .maxLines(1) // 最大行数 .fontWeight(400) .padding({ left: 12, right: 12 }) .margin({ top: 8 }) // 边距 Text(this.enablementItem.title) .height(32) .width(100%) .fontSize(12) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(2) .fontWeight(400) .fontColor(rgba(0, 0, 0, 0.6)) // 字体颜色 .padding({ left: 12, right: 12 }) .margin({ top: 2 }) } .width(160) .height(169) .borderRadius(16) .backgroundColor(Color.White) // 白色 } } Component export struct EnablementView{ State enablementList: ArticleClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(EnablementData.json).then(value { let res: string bufferToString(value); this.enablementList JSON.parse(res) as ArticleClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Column() { Text(赋能套件) .fontColor(#182431) .fontSize(16) .fontWeight(500) .fontFamily(HarmonyHeiTi-medium) .textAlign(TextAlign.Start) .padding({ left: 16 }) .margin({ bottom: 8.5 }) Grid() { ForEach(this.enablementList, (item: ArticleClass) { GridItem() { EnablementItem({ enablementItem: item }) } }, (item: ArticleClass) item.id) } .rowsTemplate(1fr) // 元素行的数量 .columnsGap(8) // 元素的列的间距 .scrollBar(BarState.Off) // 关闭滚动状态的滚动条 .height(169) .padding({ top: 2, left: 16, right: 16 }) } .margin({ top: 18 }) .alignItems(HorizontalAlign.Start) // 左侧水平对齐 } }src/main/ets/view/TutorialView.etsimport { ArticleClass } from ../model/ArticleClass; import { bufferToString } from ../util/BufferUtil; Preview Component struct TutorialItem { Prop tutorialItem: ArticleClass; build() { Row() { // 行方向自左向右铺展的对象 Column() { Text(this.tutorialItem.title) .height(19) .width(100%) .fontSize(14) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(1) .fontWeight(400) .margin({ top: 4 }) Text(this.tutorialItem.brief) .height(32) .width(100%) .fontSize(12) .textAlign(TextAlign.Start) .textOverflow({ overflow: TextOverflow.Ellipsis }) .maxLines(2) .fontWeight(400) .fontColor(rgba(0, 0, 0, 0.6)) .margin({ top: 5 }) } .height(100%) .layoutWeight(1) .alignItems(HorizontalAlign.Start) .margin({ right: 12 }) // 容器相对外部容器的距离 Image($r(this.tutorialItem.imageSrc)) .height(64) .width(108) .objectFit(ImageFit.Cover) .borderRadius(16) } .width(100%) .height(88) .borderRadius(16) .backgroundColor(Color.White) .padding(12) .alignItems(VerticalAlign.Top) // 容器内部元素的对齐 } } Component export struct TutorialView{ State tutorialList: ArticleClass[] []; aboutToAppear(): void { // build之前执行 this.getBannerDataFromJSON(); } /* 获取原生文件内容: */ getBannerDataFromJSON() { getContext(this).resourceManager.getRawFileContent(EnablementData.json).then(value { let res: string bufferToString(value); this.tutorialList JSON.parse(res) as ArticleClass[]; // this.bannerList JSON.parse(bufferToString(value)) as BannerClass[]; }) } build() { Column() { Text(入门教程) .fontColor(#182431) .fontSize(16) .fontWeight(500) .fontFamily(HarmonyHeiTi-medium) .textAlign(TextAlign.Start) .padding({ left: 16 }) .margin({ bottom: 8.5 }) List({ space: 12 }) { ForEach(this.tutorialList, (item: ArticleClass) { ListItem() { TutorialItem({ tutorialItem: item }) } }, (item: ArticleClass) item.id) } .scrollBar(BarState.Off) .padding({ left: 16, right: 16 }) } .margin({ top: 18 }) .alignItems(HorizontalAlign.Start) } }src/main/resources/rawfile/多项资源MVVMModel, View, ViewModel数据结构和数据构成的模型和视图关联数据获取的页面的生命周期应用架构设计基础——MVVM模式-HarmonyOS应用开发快速入门-Codelabs-华为开发者联盟
延伸阅读

更多相关文章

2026/9/11 1:45:14

流批安卓自动点击神器,轻松搞定重复操作

今天给大家介绍一款安卓端的自动点击神器——“自动精灵”。这款软件通过录制脚本,就能轻松实现自动点击功能,非常适合需要频繁进行重复操作的用户。这款软件凭借其强大的自动化功能,为用户带来了前所未有的便捷体验,堪称手机操作…

2026/9/15 0:18:48

从A.dx到数值积分:工程实践中的微积分核心操作指南

1. 项目概述:从“A. dx 分计算”看积分计算的实战化理解最近在整理一些工程计算和数据分析的笔记时,翻到了一个以前随手记下的标题:“A. dx 分计算”。乍一看,这像是一个数学符号的误写或简写,但仔细琢磨,它…

2026/9/15 16:27:55

STM32H7R CAN FD寄存器级配置与6501kbps采样点校准

简介:本资源是一套专为STM32H7R系列微控制器设计的CAN FD通信驱动工程,面向嵌入式开发工程师、高校电子类专业学生及STM32进阶学习者,解决该新型高性能MCU在高速车载网络通信中的底层驱动适配与快速验证难题。压缩包共268个文件,含…

2026/9/15 16:27:55

ArcGIS中实现栅格经纬度与行政区关联的三种实用方法

这个标题我一看就挺有共鸣——"Acgis中实现栅格经纬度和行政区关联",这里的Acgis我理解就是ArcGIS桌面或ArcGIS Pro这套GIS平台。这类需求在项目实施里特别常见:手里有一张栅格数据(遥感影像、DEM高程、降雨量插值、土地分类结果&a…

2026/9/15 16:27:55

Android光感器开发实战:从传感器接入到暗光跳转触发

简介:本资源是一个面向Android应用开发初学者与进阶者的光感器(环境光传感器)实战项目,聚焦于如何在真实App中获取并响应环境光照强度变化,适用于移动开发学习、传感器模块集成及UI动态适配等场景。压缩包tiaozhuan.ra…

2026/9/15 16:27:55

让浏览器替你写 Playwright 测试:playwright-cli 上手指南

让浏览器替你写 Playwright 测试:playwright-cli 上手指南 【免费下载链接】playwright-cli CLI for common Playwright actions. Record and generate Playwright code, inspect selectors and take screenshots. 项目地址: https://gitcode.com/GitHub_Trending…

2026/9/15 16:22:54

工业级火焰语义分割数据集:256×256二值mask与PyTorch加载实践

简介:本资源是一套专为计算机视觉初学者与算法工程师设计的火焰图像语义分割数据集,聚焦于工业安全、火灾监测等实际场景中的二分类分割任务。数据集包含训练集(19222对jpg原图png掩膜)与测试集(8238对)&am…

2026/9/15 4:54:30

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/15 0:01:16

AI英语单词APP开发:自适应学习算法与移动端优化实践

1. 项目概述 作为一名在移动应用开发领域摸爬滚打多年的老手,我最近完成了一个AI英语单词APP的开发项目。这个项目将传统单词记忆方法与现代AI技术相结合,打造了一款能够智能适应不同用户学习习惯的英语学习工具。 市面上大多数单词APP都存在一个通病&a…

2026/9/15 0:01:16

Flutter与OpenHarmony结合开发手语学习APP实战

1. 项目背景与核心价值作为一名同时接触过Flutter和OpenHarmony的开发者,最近我完成了一个基于Flutter for OpenHarmony的手语学习APP实战项目。这个项目最大的特点在于实现了跨平台框架与国产操作系统深度结合的创新实践——用Flutter开发的应用能完美运行在OpenHa…

2026/9/15 0:01:16

六个月成为机器人工程师:从ROS2到SLAM的实战路径

1. 六个月的紧迫感从哪来:先搞清楚你要成为哪种机器人工程师说实话,六个月的期限并不是一个宽松的时间线。市面上任何一本正经的机器人学教材都超过五百页,ROS2的官方文档可以翻到你怀疑人生,再加上ABB、KUKA这些工业机器人厂家动…

2026/9/15 14:22:53

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/14 13:53:59

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/15 11:42:23

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码