HarmonyOS开发实战( Beta5.0)自定义装饰器实践规范

news2024/9/20 7:54:50

介绍

本示例介绍通过自定义装饰器在自定义组件中自动添加inspector (布局回调)方法并进行调用。

效果图预览

不涉及

使用说明

  1. 在自定义组件上添加自定义装饰器@CallbackObserver,并根据参数设置对应的方法名和需要绑定的组件的ID。
  2. 编译工程,可以根据自定义装饰器生成方法并调用。
具体使用方法
  1. 在工程的hvigor-config.json5中配置插件。

    {
      ...
      "dependencies": {
        ...
        "@app/ets-decoration": "file:../libs/autobuilddecoration-1.0.0.tgz"
      }
    }
    
  2. 在需要使用自定义装饰器的模块的hvigorfile.ts中添加依赖和文件路径。

    import { harTasks } from '@ohos/hvigor-ohos-plugin';
    import { DecorationPluginConfig, etsDecorationPlugin } from '@app/ets-decoration';
    
    const config: PluginConfig = {
      scanFiles: [""],
    }
    export default {
      system: harTasks, /* Built-in plugin of Hvigor. It cannot be modified. */
      plugins: [etsDecorationPlugin(config)]         /* Custom plugin to extend the functionality of Hvigor. */
    }
    
  3. 在自定义组件上添加自定义装饰器@CallbackObserver,并设置对应的方法名和组件ID。

    @CallbackObserver({
     onDraw: 'onDraw',
     onLayout: 'onLayout',
     offDraw: 'offDraw',
     offLayout: 'offLayout',
     bindId: 'text'
    })
    @Component
    export struct MainPage {
     build() {
       Column() {
         Text("Hello World")
           .id('text')
       }
     }
    }
    
  4. 编译工程,即可生成对应的方法和调用代码。

实现思路

  1. 在ArkTS侧实现自定义装饰器,并配置需要的参数。

    // 自定义装饰器
    export function AutoAddInspector(param: InspectorParam) {
      return Object;
    }
    // 装饰器参数
    export interface InspectorParam {
      // inspector中onDraw需要配置的回调方法
      onDraw?: string;
      // inspector中onLayout需要配置的回调方法
      onLayout?: string;
      // inspector中offDraw需要配置的回调方法
      offDraw?: string;
      // inspector中offLayout需要配置的回调方法
      offLayout?: string;
      // 需要绑定的组件的ID
      bindId?:string;
    }
    
  2. 通过hvigorfile.ts中的配置,将使用自定义装饰器的文件路径传到插件中。

    import { DecorationPluginConfig, etsDecorationPlugin } from '@app/ets-decoration-generator';
    
    const config: DecorationPluginConfig = {
    	// 配置自定义装饰器的文件路径
        scanFiles: ["src/main/ets/components/MainPage"],
    }
    
    export default {
        system: harTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
        plugins:[etsDecorationPlugin(config)]         /* Custom plugin to extend the functionality of Hvigor. */
    }
    
  3. 将传入的文件解析为TypeScript抽象语法树,得到所有的节点信息。详细代码可参考Index.ts。

    start() {
      // 读取文件
      const sourceCode = readFileSync(this.sourcePath, "utf-8");
      // 解析文件,生成节点树信息
      const sourceFile = ts.createSourceFile(this.sourcePath, sourceCode, ts.ScriptTarget.ES2021, false);
      // 遍历节点信息
      ts.forEachChild(sourceFile, (node: ts.Node) => {
        // 解析节点
        console.log(JSON.stringify(node));
        this.resolveNode(node);
      });
    }
    
  4. 遍历节点,获取自定义装饰器中配置的参数,将方法名存入到列表中。

    // 解析装饰器
    resolveDecoration(node: ts.Node) {
      ...
      if ((propertie.name as ts.StringLiteral).text !== 'bindId') {
        // 如果参数名不是“bindId”,则放入需要创建的方法列表中
        let methodInfo: MethodInfo = new MethodInfo();
        methodInfo.name = (propertie.name as ts.StringLiteral).text;
        methodInfo.value = (propertie.initializer as ts.StringLiteral).text;
        decoratorInfo.methods.push(methodInfo);
        this.methodArray.push((propertie.initializer as ts.StringLiteral).text);
      } else {
        // 如果参数名是“buildId”,则设置到对应的变量中
        decoratorInfo.bindId = (propertie.initializer as ts.StringLiteral).text;
      }
      ...
      this.decorationInfos.push(decoratorInfo);
      ...      
    }
    
  5. 遍历节点,记录aboutToAppear()方法的位置,并和第4步中存储的列表进行比较,过滤已经存在的方法,防止生成同名方法。

    // 解析装饰器装饰的自定义组件(从“{”到“}”)
    resolveBlock(node: ts.Node) {
      ...
      // 自定义组件中已经存在的方法列表
      const methodNameArray: string[] = [];
      statements.forEach((statement: ts.Statement) => {
        ...
        const identifier = callExpression.expression as Identifier;
        methodNameArray.push(identifier.escapedText.toString());
        // 查找是否已经存在aboutToAppear方法
        if (identifier.escapedText === 'aboutToAppear') {
          this.aboutToAppearExist = true;
          this.positionOfAboutToAppear = statement.pos;
        }
        ...
      })
      // 过滤已经存在的装饰器中的方法
      const temp = this.methodArray.filter((value: string, index: number) => {
        return !methodNameArray.includes(value);
      })
      this.methodArray = temp;
      // 记录自定义组件的结束位置
      this.positionOfBlockEnd = node.end;
      }
    }
    
  6. 根据解析结果,生成方法代码和相关调用代码,并写入原文件中。

    function pluginExec(config: DecorationPluginConfig) {
      ...
      // 开始解析文件
      analyzer.start();
      // 如果解析的文件中存在装饰器,则将结果保存到列表中
      if (analyzer.routerAnnotationExisted) {
        // 如果有需要创建的方法
        if (analyzer.methodArray.length > 0) {
          ...
          // 装饰器中如果设置了bindId,则添加listener变量,并在aboutToAppear中调用监听方法
          // aboutToAppear方法是否已存在 
          if (analyzer.aboutToAppearExist) {
            // 如果已经存在aboutToAppear,则根据aboutToAppear方法的位置拆分结构体,并将需要生成的代码添加到对应的位置
            ...
          } else {
            // 如果不存在aboutToAppear方法,则创建aboutToAppear方法,并添加调用代码
            ...
          }
          // 根据模板创建装饰器中配置的方法
          ...
          // 将生成的代码写入文件中
          writeFileSync(sourcePath, fileContent, { encoding: "utf8" })
        }
      }
      ...
    }
    

工程结构&模块类型

customdecoration                               // har类型
|---components
|   |---CallbackObserver.ets                   // 自定义装饰器
|   |---MainPage.ets                           // UI页面

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为体系杂乱无章,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)路线、视频、文档用来跟着学习是非常有必要的。

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

鸿蒙 NEXT 全栈开发学习笔记 希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2128617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[240912] X-CMD 发布 v0.4.10:新增 spf 模块 | 新增 gh model 功能 | advise、brew 等模块修复

目录 X-CMD 发布 v0.4.10📃Changelog✨ gh✨ spf - 终端文件管理器💡 advise📦 brew - MacOs 系统的包管理工具📂 df 💿📝 TLDR✅ 升级指南 X-CMD 发布 v0.4.10 📃Changelog ✨ gh 新增了 gh …

软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)

软考 – 软件设计师 – 二轮复习(3) – 数据结构(持续更新) 文章目录 软考 -- 软件设计师 -- 二轮复习(3) -- 数据结构(持续更新)前言一、时间、空间复杂度二、递归式时间复杂度三、线性表四、栈五、栈和队列六、串七、朴素模式匹配八、KMP模式匹配九、数组十、矩阵十一、树、二…

思路好!硕士生一作发TOP期刊!!!

2024年8月26日,福建理工大学建筑与城乡规划学院2023级城乡规划学硕士研究生岳谞攀以第一作者在国际知名期刊《Sustainable Cities and Society》在线发表题为“Constructing an urban heat network to mitigate the urban heat island effect from a connectivity p…

[网络]TCP/IP协议 之 TCP协议的核心机制(2)

文章目录 TCP核心机制1. 确认应答2. 超时重传3. 连接管理三次握手四次挥手 4. 滑动窗口5. 流量控制6. 拥塞控制7. 延时应答8. 捎带应答9. 粘包问题10. 异常情况 TCP核心机制 1. 确认应答 (上篇) 2. 超时重传 (上篇) 3. 连接管理 建立连接的流程: 三次握手 断开连接的流程…

大模型书籍丨国内顶尖院校出品,非常火爆的LLM大模型入门中文书来了

最近有一本人工智能入门的书比较火,这本书集合了最新的产品、技术,并通过顶尖院校的教授书写而成。我今天阅读了第一章,感觉浅显易懂,顺便把笔记也做出来了,供大家参考。 大语言模型入门 第一部分 背景与基础知识 第…

【小沐学OpenGL】Ubuntu环境下glad的安装和使用

文章目录 1、简介1.1 OpenGL简介1.2 glad简介 2、安装glad2.1 手动安装glad2.2 git安装glad2.3 源码编译成glad单独库 3、测试glad3.1 例子13.2 例子2 结语 1、简介 1.1 OpenGL简介 OpenGL作为图形界的工业标准,其仅仅定义了一组2D和3D图形接口API,而对…

【最新】全球各国新冠疫情数据集(2020.1-2024.8)

新冠疫情,即新型冠状病毒引发的肺炎疫情,自2019年底首次爆发以来,对全球公共卫生、经济和社会生活产生了深远影响。本次分享的是全球新冠疫情数据,世界各国的新冠疫情数据呈现出复杂多变的态势,不同国家和地区的疫情严…

【软件设计师真题】下午题第四大题---算法设计

系列文章目录 1.【软考之软件设计师】PPT课件 2.【软考之软件设计师】学习笔记 3.【软件设计师真题】下午题第一大题—数据流图设计 4.【软件设计师真题】下午题第二大题—数据库设计 5.【软件设计师真题】下午题第三大题—UML 分析与设计 6.【软件设计师真题】下午题第四…

UEFI学习笔记(八):Memory Services

UEFI学习笔记(八):Memory Services 一、内存服务概况1、PEI阶段2、DXE阶段(系统内存)3、SMM阶段 二、HOB概述1、为什么在PEI阶段要引入HOB?2、HOB的类型 三、MEMORY类型四、内存分布1、PEI内存分布2、DXE内…

上海亚商投顾:沪指探底回升 华为产业链午后爆发

上海亚商投顾前言:无惧大盘涨跌,解密龙虎榜资金,跟踪一线游资和机构资金动向,识别短期热点和强势个股。 一.市场情绪 沪指昨日探底回升,深成指、创业板指盘中跌逾1%,午后集体拉升翻红。华为产业链午后走强…

一天一道算法题day05

目录 合并两个有序链表 什么是链表? 链表的基本概念: Java 中的链表实现 Java 内置 LinkedList 类: 回到题目 解题思路 代码实现 总结: 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼…

【几维安全-注册_登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 暴力破解密码,造成用户信息泄露短信盗刷的安全问题,影响业务及导致用户投诉带来经济损失,尤其是后付费客户,风险巨大,造成亏损无底洞…

设计模式之建造者模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、建造者模式2、建造者模式使用场景3、优点4、缺点5、主要角色6、代码示例:1)实现要求2)UML图3)实现步骤:1)创建一个表示食物条目和食物包装的接口2)创建实现Packing接口的实体类3&a…

828华为云征文 | 深入解析华为云X实例保障云上业务安全的关键策略

前言 在云计算快速发展的背景下,安全问题一直是企业上云过程中关注的焦点。随着数据迁移至云端,企业对云计算平台的安全性能提出了更高要求,特别是如何防止数据泄露、网络攻击、以及确保合规性等问题至关重要。华为云作为全球领先的云服务提供…

分类预测|基于哈里斯鹰优化最小二乘支持向量机的数据分类预测Matlab程序HHO-LSSVM多特征输入多类别输出

分类预测|基于哈里斯鹰优化最小二乘支持向量机的数据分类预测Matlab程序HHO-LSSVM多特征输入多类别输出 文章目录 一、基本原理1. 哈里斯鹰优化算法(HHO)2. 最小二乘支持向量机(LSSVM)HHO-LSSVM模型流程总结 二、实验结果三、核心…

2024/9/12 408“回头看”之文件元数据和索引节点

文件元数据: 索引节点: 把所有文件元数据放在一起,其中只保存文件名和索引节点号,然后通过索引节点来指向其他信息: 索引节点放在外存。 未采用索引节点:找目录项得一个磁盘块、一个磁盘块的找&#xff…

通用四期ARM架构银河麒麟桌面操作系统V10【安装、配置FTP客户端】

一、操作环境 服务端:银河麒麟桌面操作系统V10SP1 客户端:银河麒麟桌面操作系统V10SP1 二、服务端配置 注:以下命令均在终端执行 鼠标点击桌面右键,选择打开终端 操作步骤: 1、安装vsftpd软件:如果提…

【运维监控】Prometheus+grafana+kafka_exporter监控kafka运行情况

本示例通过kafka_exporter收集kafka的监控指标,然后将数据收集到prometheus中,最后通过grafana的dashboard导入模板进行可视化。本示例分为四个部分,即prometheus、grafana部署、kafka_exporter部署与配置和最后的集成。说明:本示…

智科python毕业设计方向汇总

文章目录 🚩 1 前言1.1 选题注意事项1.1.1 难度怎么把控?1.1.2 题目名称怎么取? 1.2 开题选题推荐1.2.1 起因1.2.2 核心- 如何避坑(重中之重)1.2.3 怎么办呢? 🚩2 选题概览🚩 3 项目概览题目1 : 深度学习社…

12、xinference部署与自定义模型

1、环境创建 创建虚拟环境 conda create --name xinference python3.10.9激活虚拟环境 conda activate xinference2、安装文件 官网:https://inference.readthedocs.io/zh-cn/latest/getting_started/installation.html pip install "xinference[transfor…