HarmonyOS 之 @Require 裝飾器自學指南

在 HarmonyOS 應用開發工作中,我頻繁碰到組件初始化傳參校驗的難題。在復雜的組件嵌套里,要是無法確保必要參數在構造時準確傳入,就極易引發運行時錯誤,而且排查起來費時費力。一次偶然的機會,我接觸到了?@Require?裝飾器,它能在編譯階段就對組件構造傳參進行嚴格校驗,大大提升了代碼的健壯性和開發效率。然而在學習過程中,我發現相關資料零散且缺乏系統性。因此,我決定撰寫這篇博客,把自己的學習經驗和實踐成果分享出來,助力更多開發者快速掌握?@Require?裝飾器的使用方法。

1. HarmonyOS 開發文檔概述

HarmonyOS 開發文檔為開發者提供了全面且細致的指導,涵蓋了從基礎入門到高級 API 應用的各個方面。當前使用的是 HarmonyOS 5.0.3 (15) 版本,其 API 能力級別為 API 15 Release。詳細的版本配套關系可參考版本說明文檔,這有助于我們精準地使用適合當前版本的 API 功能。

2. @Require 裝飾器概述

2.1 定義與作用

@Require?是一個用于校驗?@Prop@State@Provide@BuilderParam?和普通變量(無狀態裝飾器修飾的變量)是否需要構造傳參的裝飾器。當它與這些變量結合使用時,在構造自定義組件時,這些變量必須在構造時傳參,否則編譯將無法通過。

2.2 版本支持情況

  • 從 API version 11 開始,@Require?對?@Prop?和?@BuilderParam?進行校驗,并且支持在元服務中使用。
  • 從 API version 12 開始,它對?@State@Provide?和普通變量(無狀態裝飾器修飾的變量)進行校驗。

3. @Require 裝飾器的限制條件

3.1 修飾范圍限制

@Require?裝飾器僅能用于裝飾?struct?內的?@Prop@State@Provide@BuilderParam?和普通變量(無狀態裝飾器修飾的變量)。如果在其他地方使用,會導致代碼不符合規范。

3.2 預覽器限制

預覽器限制場景需要參考?PreviewChecker?檢測規則。這意味著在使用預覽器查看組件效果時,需要確保代碼符合相關規則,否則可能無法正常預覽。

4. @Require 裝飾器的使用場景

4.1 父子組件傳參校驗

當?Child?組件內使用?@Require?裝飾器和?@Prop@State@Provide@BuilderParam?和普通變量(無狀態裝飾器修飾的變量)結合使用時,父組件?Index?在構造?Child?時必須傳參,否則編譯不通過。以下是一個示例代碼:

@Entry
@Component
struct Index {@State message: string = 'Hi, HarmonyOS';@Builder buildTest() {Row() {Text('Hi, Harmony World').fontSize(40)}}build() {Row() {Child({ regular_value: this.message, state_value: this.message, provide_value: this.message, initMessage: this.message, message: this.message,buildTest: this.buildTest, initBuildTest: this.buildTest })}}
}@Component
struct Child {@Builder buildFunction() {Column() {Text('initBuilderParam - Custom').fontSize(40).fontColor('#FF8C00')}}@Require regular_value: string = 'Hi';@Require @State state_value: string = "Hi";@Require @Provide provide_value: string = "Hi";@Require @BuilderParam buildTest: () => void;@Require @BuilderParam initBuildTest: () => void = this.buildFunction;@Require @Prop initMessage: string = 'Hi';@Require @Prop message: string;build() {Column() {Text(this.initMessage).fontSize(40).fontColor('#008080')Text(this.message).fontSize(40).fontColor('#008080')this.initBuildTest();this.buildTest();}.width('100%').height('100%')}
}

在這個示例中,父組件?Index?在構造?Child?組件時,為?Child?組件的所有使用?@Require?裝飾的變量都傳遞了參數,確保了編譯的順利通過。同時,對文本的字體大小和顏色進行了修改,增強了視覺效果。

4.2 使用 @ComponentV2 修飾的組件初始化

使用?@ComponentV2?修飾的自定義組件?ChildPage?通過父組件?ParentPage?進行初始化,因為有?@Require?裝飾,所以父組件必須進行構造賦值。以下是示例代碼:

@ObservedV2
class Info {@Trace name: string = '';@Trace age: number = 0;
}@ComponentV2
struct ChildPage {@Require @Param childInfo: Info = new Info();@Require @Param state_value: string = "Hi";build() {Column() {Text(`ChildPage childInfo name :${this.childInfo.name}`).fontSize(30).fontWeight(FontWeight.Bold).fontColor('#FF69B4')Text(`ChildPage childInfo age :${this.childInfo.age}`).fontSize(30).fontWeight(FontWeight.Bold).fontColor('#FF69B4')Text(`ChildPage state_value :${this.state_value}`).fontSize(30).fontWeight(FontWeight.Bold).fontColor('#FF69B4')}}
}@Entry
@ComponentV2
struct ParentPage {info1: Info = { name: "Charlie", age: 35 };label1: string = "HarmonyOS Is Great";@Local info2: Info = { name: "Charlie", age: 35 };@Local label2: string = "HarmonyOS Is Great";build() {Column() {Text(`info1: ${this.info1.name}  ${this.info1.age}`) .fontSize(40).fontWeight(FontWeight.Bold).fontColor('#8A2BE2')ChildPage({ childInfo: this.info1, state_value: this.label1}) Line().width('100%').height(8).backgroundColor('#FF0000').margin(15)Text(`info2: ${this.info2.name}  ${this.info2.age}`) .fontSize(40).fontWeight(FontWeight.Bold).fontColor('#8A2BE2')ChildPage({ childInfo: this.info2, state_value: this.label2}) Line().width('100%').height(8).backgroundColor('#FF0000').margin(15)Button("Update info1&info2").onClick(() => {this.info1 = { name: "David", age: 28} this.info2 = { name: "David", age: 28} this.label1 = "New Fantastic Message"; this.label2 = "New Fantastic Message"; })}}
}

在這個示例中,父組件?ParentPage?在初始化?ChildPage?組件時,為?ChildPage?組件的?childInfo?和?state_value?傳遞了參數,保證了組件的正常初始化。同時,對文本的字體大小、顏色以及線條的高度、顏色和邊距進行了修改,使界面更加美觀。

5. 錯誤場景分析

如果在使用?@Require?裝飾器時沒有在構造時傳參,會導致編譯錯誤。以下是一個錯誤示例:

@Entry
@Component
struct Index {@State message: string = 'Hello World';@Builder buildTest() {Row() {Text('Hello, world').fontSize(32)}}build() {Row() {Child()}}
}@Component
struct Child {@Builder buildFunction() {Column() {Text('initBuilderParam - Error Case').fontSize(32).fontColor('#FF00FF')}}// 使用@Require必須構造時傳參。@Require regular_value: string = 'Hello';@Require @State state_value: string = "Hello";@Require @Provide provide_value: string = "Hello";@Require @BuilderParam initBuildTest: () => void = this.buildFunction;@Require @Prop initMessage: string = 'Hello';build() {Column() {Text(this.initMessage).fontSize(32).fontColor('#FF00FF')this.initBuildTest();}}
}

在這個示例中,父組件?Index?在構造?Child?組件時沒有傳遞任何參數,由于?Child?組件中的變量使用了?@Require?裝飾器,所以這段代碼在編譯時會報錯。同時,對文本的字體大小和顏色進行了修改,方便區分不同的代碼部分。

6. 總結

@Require?裝飾器在 HarmonyOS 開發中是一個非常實用的工具,它可以幫助我們在編譯階段就發現組件構造傳參的問題,避免運行時錯誤,提高代碼的穩定性和可維護性。通過本文的介紹,你應該對?@Require?裝飾器的使用有了更深入的理解。在實際開發中,合理運用?@Require?裝飾器,能夠讓你的代碼更加健壯,開發過程更加順暢。

最后希望這篇自學指南能對你有所幫助,讓你在 HarmonyOS 開發的道路上更進一步,當然對鴻蒙有興趣的同學也歡迎點贊、收藏~!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/76095.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/76095.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/76095.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CDN節點對網絡安全掃描的影響:挑戰與應對策略

引言 在當今互聯網環境中,內容分發網絡(CDN)已成為提升網站性能和用戶體驗的關鍵技術。然而,CDN的廣泛應用也為網絡安全掃描帶來了新的挑戰。本文將深入探討CDN節點如何影響各類安全掃描工作,分析由此產生的安全風險,并提供有效的…

【Git多分支使用教程】

Git多分支使用教程 Git多分支使用手冊目錄多分支只拉取一個多分支拉取指定幾個步驟 1:克隆第一個分支步驟 2:獲取其他分支 常見問題與解決方法1. 錯誤:origin/分支名 is not a commit2. 分支名稱沖突3. --single-branch 限制 總結 Git多分支使…

【身份安全】OAuth 2.0工作原理(一)

目錄 OAuth 授權框架一、OAuth 角色二、協議流程三、應用注冊(Application Registration)用戶 ID(Client ID) 和 用戶密碼(Client Secret) 四、權限授予1、授權碼鏈接2、用戶授權申請3、應用程序接收授權碼…

大疆上云api直播功能如何實現

概述 流媒體服務器作為直播畫面的中轉站,它接收推流端的相機畫面,同時拉流端找它獲取相機的畫面。整個流程如下: 在流媒體服務器上創建流媒體應用(app),一個流媒體服務器上面可以創建多個流媒體應用約定推拉流的地址。假設流媒體服務器工作在1935端口上面,假設創建的流…

ESP-01模塊連接手機熱點問題及解決方法

在使用ESP-01模塊連接手機熱點時,可能會遇到一些問題。本文將詳細介紹如何解決這些問題,并分享最終通過將WiFi切換到2.4GHz成功解決問題的經驗。 一、問題描述 在嘗試使用ESP-01模塊連接手機熱點時,遇到了連接失敗的問題。以下是操作過程中…

NG-ZORRO中tree組件的getCheckedNodeList怎么使用

在 NG-ZORRO(Ant Design for Angular) 的 Tree 組件 中,getCheckedNodeList 方法用于獲取當前選中的節點列表(包括半選狀態節點)。以下是具體用法和示例: 基本用法 首先,確保你已通過 ViewChil…

業務流程先導及流程圖回顧

一、測試流程回顧  1. 備測內容回顧  備測內容: 本次測試涵蓋買家和賣家的多個業務流程,包括下單流程、發貨流程、搜索退貨退款、支付搶購、換貨流程、個人中心優惠券等。 2. 先測業務強調  1)測試業務流程 …

從ChatGPT到AutoGPT——AI Agent的范式遷移

一、AI Agent的范式遷移 1. ChatGPT的局限性與Agent化需求 單輪對話的“工具屬性” vs. 多輪復雜任務的“自主性” ChatGPT 作為強大的生成式AI,雖然能夠進行連貫對話,但本質上仍然是“工具型”AI,依賴用戶提供明確的指令,而無法自主規劃和執行任務。 人類介入成本過高:提…

【Kafka】分布式消息隊列的核心奧秘

文章目錄 一、Kafka 的基石概念?主題(Topic)?分區(Partition)?生產者(Producer)?消費者(Consumer)? 二、Kafka 的架構探秘?Broker 集群?副本機制? 三、Kafka 的卓越特性?高…

【藍橋杯14天沖刺課題單】Day 1

1. 題目鏈接:19937 藝術與籃球 該題目的難點主要在20240413這個日期需要結束程序跳出循環。最開始將該輸出ans的位置放在了for循環之外,此時的日期已經循環完了2024年所有的日期,則最后會統計多而導致結果錯誤。 AC代碼: #incl…

AI人工智能-Jupyter NotbookPycharm:Py開發

安裝 命令: pip install jupyter 啟動 命令: jupyter notebook 啟動成功后,下面網址會默認自動打開當前用戶的根目錄。 其實這個頁面顯示的內容,是我們電腦目錄C:\Users\當前用戶\下的文件夾 我們平常做實驗,希望在…

命懸生死線:當游戲遭遇DDoS圍剿,如何用AI破局?

文章作者:騰訊宙斯盾DDoS防護團隊 一、血色戰場:DDoS攻擊游戲產業的致命瞬間 全球黑色星期五 這是一場波及全球的“黑色星期五”,起初無人察覺,包括小林。 他剛下班到家就迫不及待打開電腦,準備體驗期待已久的《黑神話…

使用HTML5和CSS3實現3D旋轉相冊效果

使用HTML5和CSS3實現3D旋轉相冊效果 這里寫目錄標題 使用HTML5和CSS3實現3D旋轉相冊效果項目介紹技術棧核心功能實現思路1. HTML結構2. CSS樣式解析2.1 基礎樣式設置2.2 3D效果核心樣式2.3 卡片樣式 3. JavaScript交互實現3.1 旋轉控制3.2 自動播放功能 技術要點總結項目亮點總…

【HTML 基礎教程】HTML <head>

HTML <head> 查看在線實例 <title> - 定義了HTML文檔的標題 使用 <title> 標簽定義HTML文檔的標題 <base> - 定義了所有鏈接的URL 使用 <base> 定義頁面中所有鏈接默認的鏈接目標地址。 <meta> - 提供了HTML文檔的meta標記 使用 <me…

macbook電腦如何清理鍵盤防止誤觸

M1芯片的MacBook電腦關機后按任意鍵開機&#xff0c;是蘋果的功能設計。這樣設計的目的是為了方便用戶&#xff0c;讓用戶在想要使用電腦時能快速開機。但是清理電腦鍵盤的時候卻成為了一種苦惱 以下是一些清理 MacBook 鍵盤防止誤觸的方法&#xff1a; 使用工具鎖定鍵盤 Cle…

Rust 面向對象

Rust 面向對象 引言 Rust 是一種系統編程語言,以其高性能、內存安全和并發支持而受到關注。Rust 的面向對象特性是其強大功能之一,它允許開發者以面向對象的方式構建復雜的應用程序。本文將深入探討 Rust 的面向對象編程(OOP)特性,包括類的定義、繼承、封裝和多態等概念…

Redis 源碼硬核解析系列專題 - 第二篇:核心數據結構之SDS(Simple Dynamic String)

1. 引言 Redis沒有直接使用C語言的標準字符串(以\0結尾的字符數組),而是自定義了SDS(Simple Dynamic String)。SDS是Redis的基礎數據結構之一,廣泛用于鍵值存儲、命令參數等場景。本篇將深入剖析SDS的實現原理、優勢以及源碼細節。 2. 為什么不用C標準字符串? C字符串…

python-59-基于python內置庫解析html獲取標簽關鍵信息

文章目錄 1 html.parser1.1 初始化和基礎使用1.1.1 handle_starttag(self, tag, attrs)1.1.2 handle_endtag(self, tag)1.1.3 handle_startendtag(self, tag, attrs)1.1.4 handle_data(self, data)1.1.5 handle_comment(self, data)1.2 解析HTML文檔的流程2 百度搜索關鍵詞鏈接…

Java的string默認值

在Java中&#xff0c;String類型的默認值取決于其定義和實例化的方式。 以下是關于String默認值的詳細說明 未實例化的String變量? 如果定義一個String變量但未對其進行實例化&#xff08;即未使用new關鍵字或直接賦值&#xff09;&#xff0c;其默認值為:ml-search[null]。這…

高并發系統下的訂單號生成服務設計與實現

目錄 引言 訂單號設計的關鍵考量因素 基礎需求分析 唯一性保障 數據量預估 可讀性設計 系統架構考量 分庫分表兼容 可擴展性設計 技術選型與比較 性能優化 高可用性保障 實踐案例&#xff1a;高并發系統訂單號結構設計 結構詳解 業務類型標識(2位) 唯一標識部分…