鴻蒙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
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/82091.shtml
英文地址,請注明出處:http://en.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…