【HarmonyOS 5】makeObserved接口詳解

【HarmonyOS 5】makeObserved接口詳解

一、makeObserved接口是什么?

makeObserved 接口(API version 12 起可用)用于將非觀察數據轉為可觀察數據,適用于三方包類、@Sendable 裝飾的類、JSON.parse 返回的對象、collections.Array/Set/Map 等場景。

不支持 undefined和null類型。以及V1 狀態裝飾器(@State/@Prop)及已被觀察的數據,避免雙重代理。主要處理的是Object類型,非Object類型,例如基本數據類型number這種,都不支持。

需要注意的是,makeObserved主要針對的是V2的使用場景。因為它是為了解決 @Trace/@ObservedV2 無法覆蓋的痛點觀察需求。比如從網絡請求返回的JSON對象,需要在UI上進行觀測操作。就可使用makeObserved。所以V1使用@State就可解決的問題,不用考慮這個。

二、makeObserved如何使用?

(1)接口調用
使用及其簡單,只需要導入import { UIUtils } from '@kit.ArkUI’進行接口調用接口。麻煩的是識別你的入參是否支持觀測監聽。

import { UIUtils } from '@kit.ArkUI';class UserInfo {id: number = 0;
}
let observedInfo: UserInfo = UIUtils.makeObserved(new UserInfo()); 

(2)可從操作的業務場景進行區分,符合以下三種場景一般可操作:
1、三方SDK包中的數據類,這種情況下需要UI可監測,因為無法手動添加@Trace,一般可支持。
【該場景較為簡單,參考上面示例即可】

2、@Sendable裝飾的類,因為禁止動態修改屬性,一般可支持。

import { taskpool } from '@kit.ArkTS';
import { UIUtils } from '@kit.ArkUI';// 定義@Sendable裝飾的類(支持子線程傳遞)

class UserInfo {userId: number = 0;username: string = 'Guest';score: number = 0;isOnline: boolean = false;// 構造函數初始化數據constructor(userId: number, username: string) {this.userId = userId;this.username = username;}
}// 子線程任務:模擬數據處理(如網絡請求/復雜計算)

function processDataInThread(userId: number): UserInfo {// 模擬耗時操作(子線程執行)let result = new UserInfo(userId, 'Loading...');setTimeout(() => {// 模擬數據更新result.score = Math.floor(Math.random() * 100);result.isOnline = true;}, 1000);return result;
}

struct SendableMakeObservedDemo {// 主線程可觀察數據:通過makeObserved包裝@Sendable對象 observedUser: UserInfo = UIUtils.makeObserved(new UserInfo(-1, '未登錄'));build() {Column({ space: 20 }).width('100%').padding(30) {Text('@Sendable + makeObserved 演示').fontSize(24).fontWeight(500)// 顯示用戶信息Text(`用戶ID: ${this.observedUser.userId}`).fontSize(18)Text(`用戶名: ${this.observedUser.username}`).fontSize(18)Text(`分數: ${this.observedUser.score}`).fontSize(18)Text(`在線狀態: ${this.observedUser.isOnline ? '在線' : '離線'}`).fontSize(18)// 觸發子線程任務的按鈕Button('加載用戶數據(子線程處理)').onClick(() => {// 在子線程執行數據處理taskpool.execute(processDataInThread, 1001).then((user: UserInfo) => {// 子線程返回的@Sendable對象在主線程重新包裝為可觀察數據this.observedUser = UIUtils.makeObserved(user);});})// 本地修改數據的按鈕(演示可觀察性)Button('本地增加分數').onClick(() => {this.observedUser.score += 10; // 直接修改屬性,觸發UI刷新})}}
}

3、 JSON.parse返回的匿名對象,一般是網絡請求反饋,一般可支持。

import { UIUtils } from '@kit.ArkUI';
import { JSON } from '@kit.ArkTS';// 定義 JSON 數據結構(示例接口)
interface UserData {name: string;age: number;email: string;
}

struct JsonMakeObservedDemo {// 原始 JSON 字符串private rawJson: string = '{"name": "Alice", "age": 25, "email": "alice@example.com"}';// 使用 makeObserved 包裝 JSON.parse 返回的對象 observedData: UserData = UIUtils.makeObserved(JSON.parse(this.rawJson) as UserData);build() {Column({ space: 30 }).width('100%').padding(30) {// 顯示 JSON 數據Text('JSON 可觀察數據演示').fontSize(24).fontWeight(500)Text(`姓名: ${this.observedData.name}`).fontSize(18)Text(`年齡: ${this.observedData.age}`).fontSize(18)Text(`郵箱: ${this.observedData.email}`).fontSize(18)// 修改姓名的按鈕Button('修改姓名為 "Bob"').onClick(() => {this.observedData.name = 'Bob'; // 直接修改屬性,觸發 UI 刷新})// 修改年齡的按鈕Button('年齡 +1').onClick(() => {this.observedData.age++; // 數值類型修改,觸發 UI 刷新})// 重置為原始數據的按鈕Button('重置數據').onClick(() => {// 重新解析 JSON 并包裝為可觀察數據this.observedData = UIUtils.makeObserved(JSON.parse(this.rawJson) as UserData);})}}
}

三、注意

  1. getTarget問題
    通過getTarget獲取原始對象后修改屬性,不會觸發UI刷新(需操作代理對象)

  2. 兼容性錯誤
    與@State等V1裝飾器混用會拋異常,需使用V2裝飾器(@Local/@Provide等)

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

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

相關文章

豆瓣圖書數據采集與可視化分析(二)- 豆瓣圖書數據清洗與處理

文章目錄 前言一、查看數據基本信息二、拆分pub列三、日期列處理四、價格列處理五、出版社列處理六、評價人數列處理七、缺失值處理八、重復數據處理九、異常值處理十、完整代碼十一、清洗與處理后的數據集展示 前言 豆瓣作為國內知名的文化社區,擁有龐大且豐富的圖…

Wasm -WebAssembly簡介

WebAssembly 是什么? WebAssembly/wasm WebAssembly 或者 wasm 是一個可移植、體積小、加載快并且兼容 Web 的全新格式 WebAssembly(簡稱 Wasm)是一種二進制指令格式,設計用于在現代 Web 瀏覽器中高效運行程序。它可以被認為是一…

驅動開發硬核特訓 · Day 15:電源管理核心知識與實戰解析

在嵌入式系統中,電源管理(Power Management)并不是“可選項”,而是實際部署中影響系統穩定性、功耗、安全性的重要一環。今天我們將以 Linux 電源管理框架 為基礎,從理論結構、內核架構,再到典型驅動實戰&a…

【SpringBoot】99、SpringBoot中整合RabbitMQ實現重試功能

最近在做一個項目,需要使用 MQ 實現重試功能,在這里給各位分享一下。 1、整合 RabbitMQ <!-- rabbitmq消息隊列 --> <dependency><groupId>org.springframework.boot</groupId><

AI 中的 CoT 是什么?一文詳解思維鏈

文章目錄 CoT 的組成CoT 的作用CoT 的推理結構變體CoT 的特點CoT 的適用場景總結 在人工智能領域&#xff0c;尤其是自然語言處理和機器學習中&#xff0c;有一種名為思維鏈&#xff08;Chain of Thought&#xff0c;CoT&#xff09;的技術&#xff0c;它正逐漸改變著我們對 AI…

Vue3集成Element Plus完整指南:從安裝到主題定制上

一、Element Plus簡介 Element Plus是一套基于Vue 3.0的桌面端組件庫&#xff0c;由餓了么前端團隊開源維護。它提供了豐富的UI組件&#xff0c;能夠幫助開發者快速構建企業級中后臺產品。 1. 安裝與卸載 bash 復制 下載 # 安裝最新版本 npm install element-plus -S# 卸…

Java29:Spring MVC

一&#xff1a;Springmvc簡介 1.簡介&#xff1a; Spring Web MVC 是基于Servlet API構建的原始Web框架&#xff0c;從一開始就包含在Spring Framework中。正式名稱“Spring Web MVC” 來自其源模塊名稱&#xff08;spring-webmvc&#xff09;但它通常被稱為“Spring Mvc” …

VLC搭建本機的rtsp直播推流和拉流

媒體---流---捕獲設備&#xff0c;選擇攝像頭&#xff0c;點擊串流 x下一步 選擇rtsp&#xff0c;點擊添加 看到了端口&#xff0c;并設置路徑&#xff1a; 選擇Video -H 264 mp3(TS) 點擊下一個&#xff0c; 點擊流&#xff0c;就開始推流了 拉流&#xff0c;觀看端&#x…

云點數據讀寫

一、常見點云數據格式 LAS/LAZ格式 LAS是點云數據的行業標準格式 LAZ是LAS的壓縮版本 支持地理參考信息、顏色、強度等屬性 PCD格式(Point Cloud Data) PCL(Point Cloud Library)開發的格式 支持ASCII和二進制存儲 包含頭部信息和數據部分 PLY格式(Polygon File Format…

[RHEL8] 指定rpm軟件包的更高版本模塊流

背景&#xff1a;掛載RHEL ISO使用kickstart安裝操作系統&#xff0c;安裝包未指定安裝perl&#xff0c;但是安裝完可以查到其版本&#xff0c;且安裝的是ISO中多個版本中的最低版本。 原因&#xff1a;&#xff08;1&#xff09;為什么沒有裝perl&#xff0c;perl -v可以看到版…

Spring 事務管理核心機制與傳播行為應用

Spring 事務詳解 一、Spring 事務簡介 Spring 事務管理基于 AOP&#xff08;面向切面編程&#xff09;實現&#xff0c;通過 聲明式事務&#xff08;注解或 XML 配置&#xff09;統一管理數據庫操作&#xff0c;確保數據一致性。核心目標&#xff1a;保證多個數據庫操作的原子…

JavaScript解密實戰指南:從基礎到進階技巧

JavaScript加密技術廣泛應用于數據保護、反爬蟲和代碼混淆&#xff0c;但掌握解密方法能幫助開發者突破技術壁壘。本文結合爬蟲實戰與安全分析場景&#xff0c;系統梳理JS解密的核心方法與工具。 一、基礎解密方法 1. Base64解碼 適用于簡單編碼場景&#xff0c;如Cookie加密…

WEMOS LOLIN32

ESP32是結合Wi-Fi和藍牙的32位元系統單晶片&#xff08;SoC&#xff09;與外接快閃記憶體的模組。許多廠商生產採用ESP32模組的控制板&#xff0c;最基本的ESP控制板包含ESP32模組、直流電壓轉換器和USB序列通訊介面IC。一款名為WEMOS LOLIN32的ESP32控制板具備3.7V鋰電池插座。…

俄羅斯方塊-簡單開發版

一、需求分析 實現了一個經典的俄羅斯方塊小游戲&#xff0c;主要滿足以下需求&#xff1a; 1.圖形界面 使用 pygame 庫創建一個可視化的游戲窗口&#xff0c;展示游戲的各種元素&#xff0c;如游戲區域、方塊、分數等信息。 2.游戲邏輯 實現方塊的生成、移動、旋轉、下落和鎖…

使用安全繼電器的急停電路設計

使用安全繼電器的急停電路設計 一&#xff0c;急停回路的設計1&#xff0c;如何將急停接到線路當中&#xff1f;2&#xff0c;急停開關 如何接到安全繼電器中 一&#xff0c;急停回路的設計 急停是每一個設備必不可少的部分&#xff0c;因為關乎安全&#xff0c;所以說所以說他…

【讀書筆記·VLSI電路設計方法解密】問題64:什么是芯片的功耗分析

低功耗設計是一種針對VLSI芯片功耗持續攀升問題的設計策略。隨著工藝尺寸微縮&#xff0c;單顆芯片可集成更多元件&#xff0c;導致功耗相應增長。更嚴峻的是&#xff0c;現代芯片工作頻率較二十年前大幅提升&#xff0c;而功耗與頻率呈正比關系。因此&#xff0c;芯片功耗突破…

在 Debian 10.x 安裝和配置 Samba

1. 更新系統 sudo apt update sudo apt upgrade -y2. 安裝 Samba sudo apt install samba -y3. 配置 Samba 備份默認配置文件 sudo cp /etc/samba/smb.conf /etc/samba/smb.conf.bak編輯配置文件 sudo nano /etc/samba/smb.conf示例配置&#xff08;共享目錄&#xff09; …

修改PointLIO項目

添加key_frame_info.msg消息 新建.msg文件&#xff0c;內容填寫為&#xff1a; # Cloud Info Header header # cloud messages sensor_msgs/PointCloud2 key_frame_cloud_ori sensor_msgs/PointCloud2 key_frame_cloud_transed sensor_msgs/PointCloud2 key_frame_poses其中k…

關于隔離1

1.隔離的目的&#xff1a; 在隔離電源設計中&#xff0c;輸入與輸出之間沒有直接電氣連接&#xff0c;提供絕緣高阻態&#xff0c;防止電流回路。這意味著輸入與輸出之間呈現為絕緣的高阻態&#xff0c;從而確保了無電流回路的形成。 隔離與可靠保護有關。電隔離是一種電路設…

【java實現+4種變體完整例子】排序算法中【插入排序】的詳細解析,包含基礎實現、常見變體的完整代碼示例,以及各變體的對比表格

以下是插入排序的詳細解析&#xff0c;包含基礎實現、常見變體的完整代碼示例&#xff0c;以及各變體的對比表格&#xff1a; 一、插入排序基礎實現 原理 將元素逐個插入到已排序序列的合適位置&#xff0c;逐步構建有序序列。 代碼示例 public class InsertionSort {void…