鸿蒙UI开发——Builder函数的封装

1、问题引入

我们在开发中可能会遇到这样一个问题:将一个@Builder修饰后的函数用变量或者数组记录下来,在业务其他地方使用这些@Builder函数。

举个例子,有下面一段代码:

@Builderfunction builderElement() {}let builderArr: Function[] = [builderElement];@Builderfunction testBuilder() {  ForEach(builderArr, (item: Function) => {    item();  })}

我们试图将builderElement这个builder方法放到builderArr数组中,然后统一在另一个Builder方法(testBuilder)中遍历执行。

此时,我们在IDE中可以看到,会报一个如下的错误:

图片

'item()' does not comply with the UI component syntax. <ArkTSCheck>

为了解决这样的问题,ArkUI提供了wrapBuilder来让我们对Builder函数做封装。本文对wrapBuilder的使用做简单讨论。

2、wrapBuilder

wrapBuilder是一个模板函数,返回一个WrappedBuilder对象。其接口定义如下:

declare function wrapBuilder< Args extends Object[]>(builder: (...args: Args) => void): WrappedBuilder;

其中 WrappedBuilder对象也是一个模板类。定义如下:​​​​​​​

// 模板参数<Args extends Object[]>是需要包装的builder函数的参数列表declare class WrappedBuilder< Args extends Object[]> {  builder: (...args: Args) => void;  constructor(builder: (...args: Args) => void);}

📢📢需要注意:

  • wrapBuilder方法只能传入全局@Builder方法。

  • wrapBuilder方法返回的WrappedBuilder对象的builder属性方法只能在struct内部使用。

3、案 例

我们有了wrapBuilder后,开篇的代码我们就可以改造为如下(注意第3行、第7 ~ 8行):​​​​​​​

@Builderfunction builderElement() {}let builderArr: WrappedBuilder<[]>[] = [wrapBuilder(builderElement)];@Builderfunction testBuilder() {  ForEach(builderArr, (item: WrappedBuilder<[]>) => {    item.builder();  })}

我们可以注意到第3行的WrappedBuilder定义,泛型参数是一个空数组,即:WrappedBuilder<[]>,表示我们包装的builder函数是空参数。

如果我们的builder函数有传入参数,那对应在数组中按顺序传入对应的类型即可。

例如,我们将builderElement改造为有两个入参的函数,第一个是string类型,第二个是number类型,那代码将是如下(第3行、第7 ~ 8行):​​​​​​​

@Builderfunction builderElement(name: string, count: number) {}let builderArr: WrappedBuilder<[string, number]>[] = [wrapBuilder(builderElement)];@Builderfunction testBuilder() {  ForEach(builderArr, (item: WrappedBuilder<[string, number]>) => {    item.builder('欢迎加入【Harmony自习室】!', 1);  })}

除了将wrappedBuilder放到数组中,我们也可以直接赋值给变量。一个案例如下(第7行、第17行):​​​​​​​

@Builderfunction MyBuilder(value: string, size: number) {  Text(value)    .fontSize(size)}let globalBuilder: WrappedBuilder<[string, number]> = wrapBuilder(MyBuilder);@Entry@Componentstruct Index {  @State message: string = 'Hello World';  build() {    Row() {      Column() {        globalBuilder.builder(this.message, 50)      }      .width('100%')    }    .height('100%')  }}

‼️wrapBuilder不支持重复定义‼️

wrapBuilder(MyBuilderFirst)只在第一次定义时生效。即:

通过wrapBuilder(MyBuilderFirst)初始化定义builderObj之后,再次对builderObj进行赋值wrapBuilder(MyBuilderSecond)将不会起作用。示例代码如下:​​​​​​​

@Builderfunction MyBuilderFirst(value: string, size: number) {  Text('MyBuilderFirst:' + value)    .fontSize(size)}@Builderfunction MyBuilderSecond(value: string, size: number) {  Text('MyBuilderSecond:' + value)    .fontSize(size)}interface BuilderModel {  globalBuilder: WrappedBuilder<[string, number]>;}@Entry@Componentstruct Index {  @State message: string = 'Hello World';  @State builderObj: BuilderModel = { globalBuilder: wrapBuilder(MyBuilderFirst) };  aboutToAppear(): void {    setTimeout(() => {      this.builderObj.globalBuilder = wrapBuilder(MyBuilderSecond);    },1000)  }  build() {    Row() {      Column() {        this.builderObj.globalBuilder.builder(this.message, 20)      }      .width('100%')    }    .height('100%')  }}

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

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

相关文章

ARM笔记-ARM指令集

第三章 ARM指令集 3.1 ARM指令集简介 ARM微处理器的ARM指令集 &#xff0c;所有的指令长度都是32位 &#xff0c;并且大多数指令都在一个单独指令周期内执行。 主要特点&#xff1a; 指令是条件执行的ARM微处理器的指令集是加载/存储型的在多寄存器操作指令中一次最多可以完成…

Spring Boot接口通用返回值设计与实现最佳实践

一、核心返回值模型设计&#xff08;增强版&#xff09; package com.chat.common;import com.chat.util.I18nUtil; import com.chat.util.TraceUtil; import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter;import java.io.Serializable;/*** 功能: 通…

2025年上半年软件架构师考试回忆版【持续更新】

文章目录 案例分析1、端AI相对于云AI的优势2、redis持久化&#xff0c;主从库3、解释器架构风格4、知识图谱5、区块链 论文1、基于事件驱动的模型2、多模型数据库及其应用3、负载均衡设计方法4、论软件测试理论及其应用 考试感受 2025年软件考试架构考试于5月24日如期举行&…

Windows下编译Zipios

本文记录在Windows下编译Zipios的流程。 注1&#xff1a;文章内容会不定期更新。 零、环境 操作系统Windows 11VS Code1.92.1Git2.34.1Visual StudioVisual Studio Community 2022CMake3.22.1 一、安装依赖 二、编译 2.1 下载代码 git clone https://github.com/Zipios/Zi…

SOC-ESP32S3部分:11-任务创建

飞书文档https://x509p6c8to.feishu.cn/wiki/EH3owsPahisvl6kL6k3cqaQ3n0g 在我们学习单片机的时候&#xff0c;main函数入口中一般有一个while大循环在不停轮询&#xff0c;如果我们需要实现多种不同的业务&#xff0c;就需要用到状态机&#xff0c;根据不同时刻的要求执行不…

[Git] 如何进行版本回退

版本控制系统最重要的能力之一&#xff0c;就是能够轻松地在项目的不同历史版本之间切换。有时&#xff0c;你可能发现最近的修改引入了严重问题&#xff0c;或者需要回到之前的某个节点重新开始。这时&#xff0c;“版本回退”功能就派上用场了。 版本回退&#xff1a;反方向…

易贝平台关键字搜索技术深度解析

一、核心搜索机制 关键词匹配原理 采用TF-IDF算法计算关键词权重 支持同义词扩展&#xff08;如"phone"匹配"cellphone"&#xff09; 标题权重 > 副标题 > 商品描述 搜索排序因素 # 搜索权重模拟计算 def calculate_rank(keyword, item): title…

深度剖析 MCP SDK 最新版:Streamable HTTP 模式

好记忆不如烂笔头&#xff0c;能记下点东西&#xff0c;就记下点&#xff0c;有时间拿出来看看&#xff0c;也会发觉不一样的感受. 目录 一、概述 二、快速上手&#xff1a;开启 Streamable HTTP 服务端开启 客户端连接 三、深入两个核心参数 stateless_http json_resp…

树莓派开箱上手教程(无需显示器版)

树莓派开箱上手教程&#xff08;无需显示器版&#xff09; 硬件准备 名称参数电源适配器5V电源适配器&#xff0c;至少需要3A的额定电流&#xff0c;配备USB Type-C输出接头microSD卡用来将树莓派的操作系统安装到上边&#xff0c;至少需要8GB容量&#xff0c;一般建议16GB及以…

MySQL强化关键_015_存储过程

目 录 一、概述 1.说明 2.优点 3.缺点 二、存储过程的操作 1.创建 2.调用 3.查看 4.删除 三、变量 1.系统变量 &#xff08;1&#xff09;说明 &#xff08;2&#xff09;查看系统变量 &#xff08;3&#xff09;设置系统变量 2.用户变量 &#xff08;1&…

动态规划dp

这里写目录标题 动态规划01背包完全背包多重背包混合背包二维费用的背包分组背包有依赖的背包背包问题求方案数背包问题求具体方案数位 DP状压 DP常用例题 动态规划 01背包 有 n n n 件物品和一个容量为 W W W 的背包&#xff0c;第 i i i 件物品的体积为 w [ i ] w[i] w…

arcgis js统计FeatureLayer的椭球面积、平面面积

1、导入依赖 import FeatureLayer from arcgis/core/layers/FeatureLayer import { geodesicArea, planarArea, simplify } from arcgis/core/geometry/geometryEngine; import { project, load as projectionLoad } from arcgis/core/geometry/projection2、初始化project o…

2.2.1 05年T2

引言 本文将从一预习、二自习、三学习、四复习等四个阶段来分析2005年考研英语阅读第二篇文章。为了便于后续阅读&#xff0c;我将第四部分复习放在了首位。 四、复习 方法&#xff1a;错误思路分析总结考点文章梳理 4.1 错题分析 题目&#xff1a;26&#xff08;细节题&…

Java 连接并操作 Redis 万字详解:从 Jedis 直连到 RedisTemplate 封装,5 种方式全解析

引言 在分布式系统和高并发场景中&#xff0c;Redis 作为高性能内存数据库的地位举足轻重。对于 Java 开发者而言&#xff0c;掌握 Redis 的连接与操作是进阶必备技能。然而&#xff0c;从基础的 Jedis 原生客户端到 Spring 封装的 RedisTemplate&#xff0c;不同连接方式的原…

谈谈对《加密算法》的理解

文章目录 一、什么是加密算法&#xff1f;二、常见的加密算法有哪些&#xff1f;2.1 对称加密2.2 非对称加密2.3 哈希算法 三、加密算法代码展示3.1 MD5加密3.2 秘钥加密3.3 AES加密解密 四、加密算法的使用场景 一、什么是加密算法&#xff1f; 加密算法是一种通过数学方法将…

Fuzz 模糊测试篇JS 算法口令隐藏参数盲 Payload未知文件目录

1 、 Fuzz 是一种基于黑盒的自动化软件模糊测试技术 , 简单的说一种懒惰且暴力的技术融合了常见 的以及精心构建的数据文本进行网站、软件安全性测试。 2 、 Fuzz 的核心思想 : 口令 Fuzz( 弱口令 ) 目录 Fuzz( 漏洞点 ) 参数 Fuzz( 利用参数 ) PayloadFuzz(Bypass)…

哈希表的实现(下)

目录 前言 开散列概念 开散列实现 Insert 优化 Find Erase 前言 上一章节我们用闭散列实现了一下哈希表&#xff0c;但存在一些问题&#xff0c;比如空间浪费比较严重&#xff0c;如果连续一段空间都已经存放值&#xff0c;那么在此位置插入新值的时候就会一直挪动&…

再谈Linux 进程:进程等待、进程替换与环境变量

目录 1.进程等待 为什么需要进程等待&#xff1f; 相关系统调用&#xff1a;wait()和waitpid() wait(): waitpid(): 解析子进程状态&#xff08;status&#xff09; 2.进程替换 为什么需要进程替换&#xff1f; 相关系统调用&#xff1a;exec函数家族 3.环境变量 ​…

基于深度学习的无线电调制识别系统

基于深度学习的无线电调制识别系统 本项目实现了一个基于深度学习的无线电调制识别系统&#xff0c;使用LSTM&#xff08;长短期记忆网络&#xff09;模型对不同类型的 无线电信号进行自动分类识别。该系统能够在不同信噪比(SNR)条件下&#xff0c;准确识别多种调制类型&#…

Python 爬虫之requests 模块的应用

requests 是用 python 语言编写的一个开源的HTTP库&#xff0c;可以通过 requests 库编写 python 代码发送网络请求&#xff0c;其简单易用&#xff0c;是编写爬虫程序时必知必会的一个模块。 requests 模块的作用 发送网络请求&#xff0c;获取响应数据。 中文文档&#xf…