Harmony狀態管理AppStorageV2和PersistenceV2

深入理解ArkUI中的AppStorageV2與PersistenceV2裝飾器

引言

在ArkUI應用開發中,狀態管理是構建復雜應用的關鍵環節。隨著ArkUI狀態管理V2版本的推出,AppStorageV2和PersistenceV2裝飾器為開發者提供了更強大、更靈活的狀態管理能力。本文將詳細介紹這兩個核心裝飾器的功能特點、使用方法和實際應用場景。

一、AppStorageV2:應用全局UI狀態存儲

1.1 基本概念

AppStorageV2是與應用進程綁定的全局UI狀態存儲容器,由UI框架在應用程序啟動時創建,為應用程序的UI狀態數據提供中央存儲。與V1版本相比,AppStorageV2提供了更豐富的裝飾器和工具,幫助開發者在自定義組件之間共享數據,確保數據變化自動同步到UI。

1.2 核心功能

AppStorageV2的主要特點包括:

  • 應用級的全局狀態共享
  • 支持主線程內多個UIAbility實例間的數據共享
  • 提供靜態API接口進行手動操作
  • 支持多種數據類型,包括簡單類型和復雜對象

1.3 常用API示例

// 連接AppStorageV2
const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass());// 移除數據
AppStorageV2.remove('key_as2');// 獲取所有key
const keys: Array<string> = AppStorageV2.keys();

1.4 使用場景

@ObservedV2
class SampleClass {@Trace p: number = 0;
}// 將key為SampleClass、value為new SampleClass()對象的鍵值對存儲到內存中
const as1: SampleClass | undefined = AppStorageV2.connect(SampleClass, () => new SampleClass());// 在組件中使用
@Entry
@ComponentV2
struct TodoList {@Local storage: SampleClass = AppStorageV2.connect(SampleClass, 'SampleClass', () => new SampleClass())!;build() {Column() {Text(`Value: ${this.storage.p}`).onClick(() => {this.storage.p++;})}}
}

二、PersistenceV2:持久化存儲UI狀態

2.1 基本概念

PersistenceV2繼承自AppStorageV2,提供了將UI狀態持久化保存到設備磁盤的能力。與AppStorageV2的運行時內存不同,PersistenceV2能確保即使應用關閉后再啟動,數據依然保持不變。

2.2 核心功能

PersistenceV2的主要特點包括:

  • 數據持久化保存到設備磁盤
  • 支持復雜對象的序列化和反序列化
  • 自動同步內存和磁盤數據
  • 提供錯誤回調機制

2.3 常用API示例

// 持久化數據
PersistenceV2.save('key_as2');// 錯誤回調
PersistenceV2.notifyOnError((key: string, reason: string, msg: string) => {console.error(`error key: ${key}, reason: ${reason}, message: ${msg}`);
});

2.4 使用場景

@ObservedV2
class TaskList {@Type(Task)@Trace tasks: Task[] = [];constructor(tasks: Task[]) {this.tasks = tasks;}async loadTasks(context: common.UIAbilityContext) {// 從文件加載任務數據let getJson = await context.resourceManager.getRawFileContent('defaultTasks.json');// 解析并初始化tasks}
}@Entry
@ComponentV2
struct TodoList {@Local taskList: TaskList = PersistenceV2.connect(TaskList, 'TaskList', () => new TaskList([]))!;async aboutToAppear() {if (this.taskList.tasks.length === 0) {await this.taskList.loadTasks(this.context);}}build() {Column() {ForEach(this.taskList.tasks, (task: Task) => {TaskItem({ task: task })})}}
}

三、AppStorageV2與PersistenceV2的配合使用

3.1 數據流示意圖

UI組件 <--> AppStorageV2(內存) <--> PersistenceV2(磁盤)

3.2 典型應用模式

@ObservedV2
class Setting {@Trace showCompletedTask: boolean = true;
}@Entry
@ComponentV2
struct TodoList {@Local setting: Setting = AppStorageV2.connect(Setting, 'Setting', () => new Setting())!;@Local taskList: TaskList = PersistenceV2.connect(TaskList, 'TaskList', () => new TaskList([]))!;build() {Column() {// 顯示/隱藏已完成任務開關Toggle({type: ToggleType.Switch, isOn: this.setting.showCompletedTask}).onChange((isOn) => {this.setting.showCompletedTask = isOn;})// 任務列表ForEach(this.taskList.tasks, (task: Task) => {if (this.setting.showCompletedTask || !task.isFinish) {TaskItem({ task: task })}})}}
}

四、遷移指南

4.1 從V1遷移到V2

V1裝飾器名V2裝飾器名說明
@Provide/@Consume@Provider/@Consumer基本兼容,alias規則有變化
@State@Local功能類似,@Local禁止外部初始化
@LocalStorage全局@ObservedV2/@Trace使用類替代LocalStorage實例
PersistentStoragePersistenceV2功能更強大,可獨立使用

4.2 遷移示例

// V1版本
@Entry
@Component
struct Parent {@State parentFruit: Fruit = new Fruit();build() {Child({ fruit: this.parentFruit })}
}// V2遷移后
@ObservedV2
class Fruit {@Trace apple: number = 5;@Trace orange: number = 10;clone(): Fruit {let newFruit = new Fruit();newFruit.apple = this.apple;newFruit.orange = this.orange;return newFruit;}
}@Entry
@ComponentV2
struct Parent {@Local fruit: Fruit = new Fruit();build() {Child({ fruit: this.fruit.clone() })}
}

五、最佳實踐與注意事項

5.1 最佳實踐

  1. 合理設計數據結構:避免持久化大型數據集或頻繁變化的變量
  2. 最小化共享范圍:根據需求選擇最小范圍的共享方案
  3. 類型安全:確保AppStorageV2中存儲的數據類型與使用時一致
  4. 錯誤處理:實現PersistenceV2的錯誤回調以處理持久化失敗情況

5.2 注意事項

  1. PersistenceV2持久化操作是同步的,應避免在主線程進行大量數據持久化
  2. AppStorageV2不支持線程間共享對象
  3. 復雜對象的持久化需要使用@Type裝飾器標記類型
  4. 避免在PersistenceV2中存儲方法或非序列化對象

六、總結

AppStorageV2和PersistenceV2作為ArkUI狀態管理V2的核心組成部分,為開發者提供了強大的應用狀態管理能力。通過本文的介紹,我們了解了它們的基本概念、核心功能和使用方法,以及從V1到V2的遷移策略。在實際開發中,合理運用這些裝飾器可以顯著提高應用的可維護性和用戶體驗。

隨著ArkUI的不斷發展,狀態管理V2的功能也將不斷完善,建議開發者持續關注官方文檔,掌握最新的開發技術和最佳實踐。

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

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

相關文章

LayUI的table實現行上傳圖片+mvc

一、layUIJQuery using AMes.Domain.Entity.SystemManage; {Layout null; }<!DOCTYPE html><html> <head><meta name"viewport" content"widthdevice-width" /><title>不合格品處置申請</title><link href"…

ALINX 國產化 FPGA SoM 核心板選型指南:紫光同創 Kosmo2/Titan2/ Logos2/Logos 深度解析

作為紫光同創官方合作伙伴&#xff0c;ALINX 近日發布基于 Kosmo-2 系列新品 PG2K100 核心板 K100。 35mm42mm 的精小尺寸中集成雙核 A53 處理器85K FPGA 邏輯單元&#xff0c;1GB DDR3 保障實時數據處理能力&#xff0c;120 pin 工業連接器直插各類設備底板&#xff0c;為空間…

從零到一構建一個現代“C++游戲自研引擎”開發藍圖

當然不可能是真從零到一了&#xff0c;做為一個標題黨&#xff0c;標題不牛對不起自己&#xff0c;因為游戲引擎涉及太多領域了&#xff0c;比如圖形渲染、物理模擬、音頻處理、網絡通信等等。每個領域都有專業的解決方案&#xff0c;自己從頭實現不僅效率低&#xff0c;而且質…

XSS-labs靶場實戰

本文主要對XSS-labs靶場進行介紹&#xff0c;給出了我一步步怎么發現漏洞的過程。 目錄 第一關 第二關 第三關 第四關 第五關 第六關 第七關 第八關 第九關 第十關 第十一關 第十二關 第十三關 第十四關 第十五關 第十六關 第一關 沒啥好說的&#xff0c;直接…

day46-硬件學習之 小練習及中斷

一、蜂鳴器學習 代碼實現&#xff1a; 二、BSP工程管理 利用BSP工程管理&#xff0c;使文檔顯示不雜亂&#xff1b; 將這些文件分為4類&#xff0c;并保存到4個不同的文件夾里。 首先在新的工程文件夾里創建一個之后我們編寫的類似led驅動&#xff0c;clk驅動等等外設驅動程序都…

ArkUI-X通過Stage模型開發Android端應用指南(二)

StageApplication初始化支持以下三種方式 1. 通過繼承StageApplication的方式進行初始化 import ohos.stage.ability.adapter.StageApplication;public class HiStageApplication extends StageApplication {Overridepublic void onCreate() {super.onCreate();} }2. 繼承And…

主從復制的優勢是什么?如好搭建一個主從復制呢?

引言&#xff1a; 最近因為時間緣故&#xff0c;學校&#xff0c;比賽&#xff0c;面試很久沒有更新了&#xff0c;現在開始將會持續更新&#xff01;&#xff01;&#xff01;歐克。我們往下看&#xff1a; 概述&#xff1a; 主從復制是指將主數據庫的DDL和DML操作通過二進制…

Linux Shell腳本中basename和dirname的詳細用法教程

在Linux Shell腳本中&#xff0c;basename和 dirname是兩個非常實用的命令&#xff0c;常用于處理文件路徑和名稱。本文將詳細介紹這兩個命令的用法&#xff0c;并提供豐富的示例代碼&#xff0c;以幫助您更好地理解和應用它們。 一、basename命令 1.1 基本用法 basename命令…

3D世界里的“盜夢空間”!在方塊里再造一個世界?高級特效get?

有沒有想過&#xff0c;游戲里的鏡子、傳送門、或者屏幕上播放的實時3D動畫是怎么實現的&#xff1f; 答案就是一項黑科技——渲染目標&#xff08;Render Targets&#xff09;。它允許我們不直接渲染到屏幕&#xff0c;而是“偷偷地”渲染到一張幕后的貼圖上&#xff0c;然后…

淺析一種基于深度學習算法的維吾爾文OCR技術的實現原理及其應用場景

維吾爾文OCR技術是一種基于人工智能和深度學習技術的維吾爾文光學字符識別工具&#xff0c;能夠快速、準確地將印刷體或手寫體維吾爾文轉換為可編輯、可搜索的數字化文本。該技術適用于政府、教育、出版、金融等多個行業&#xff0c;助力維吾爾文信息的高效處理與智能化管理。 …

如何使用MQTTX軟件來進行MQTT協議的測試

下載MQTTX軟件 下載地址及說明文檔開始使用 - MQTTX 文檔,比較詳細 為什么使用MQTTX 何時要使用MQTTX軟件呢&#xff1f;用來檢測物聯網模塊上云的數據就很方便&#xff0c;當然云上如果有日志系統的話也是可以用的。 物聯網模塊&#xff0c;以利爾達模塊為例 NT26-KCN系列…

ELK 和 OpenShift 中的 EFK

ELK 和 OpenShift 中的 EFK 確實是同類日志解決方案的不同實現&#xff0c;核心功能相似但組件略有差異。以下是詳細對比和解釋&#xff1a; 1. ELK vs EFK&#xff1a;核心區別 組件ELK 棧EFK 棧&#xff08;OpenShift 默認&#xff09;日志收集Logstash&#xff08;Java 實現…

Python UDP Socket 實時在線刷卡掃碼POS消費機門禁控制服務端示例源碼

本示例使用的設備&#xff1a;https://item.taobao.com/item.htm?spma21dvs.23580594.0.0.1d292c1bk8Qc9r&ftt&id17021194999 一、服務端綁定IP開啟UDP端口接收消費機提交的請求 import sys import os import socket import time import datetimeIpList[] if sys.pl…

對于高考邊界的理解以及未來就業層級的學習與思考

目錄 一、2024年高考全國多少考生&#xff0c;文化課&#xff0c;文科理科&#xff0c;分別總分多少分&#xff1f;清北得多少分能上&#xff1f;二、1342萬人里面&#xff0c;有多少人能上清北&#xff0c;多少能上985&#xff0c;多少能上211&#xff0c;多少能上二本&#x…

JVM調優實戰 Day 4:JVM類加載機制

【JVM調優實戰 Day 4】JVM類加載機制 文章內容 在Java虛擬機&#xff08;JVM&#xff09;的運行過程中&#xff0c;類加載機制是整個程序啟動和運行的基礎。它決定了Java類是如何被動態加載到JVM中&#xff0c;并為后續的字節碼執行做好準備。理解JVM類加載機制不僅有助于我們…

R 語言中的判斷語句

R 語言中的判斷語句 在R語言編程中&#xff0c;判斷語句是執行條件邏輯的基礎。它們允許程序根據特定的條件執行不同的代碼塊。本文將深入探討R語言中的幾種常見判斷語句&#xff0c;包括if語句、if-else語句和switch語句&#xff0c;并探討它們的用法和場景。 1. if語句 if…

從設備自動化到智能管控:MES如何賦能牛奶飲料行業高效生產?

萬界星空科技全新推出的&#xff1a;新一代智能化MES系統&#xff0c;深度融合AI大數據技術&#xff0c;實現生產全流程可視化、智能排產、實時質量追溯與設備互聯&#xff0c;助力企業降本增效30%。 現開放免費試用名額&#xff0c;體驗智能化生產管理的高效與便捷&#xff01…

TDengine 技術參數配置大全

1. 背景 TDengine 的 taos.cfg 中配置項及使用 SQL 命令 alter 修改的系統變量之間的關系如何&#xff0c;哪些是持久存儲項&#xff0c;哪些設置是臨時項&#xff0c;這章將詳細說明。 本文是技術參考資料&#xff0c;請收藏。 2.定義 1. 全局配置參數 全局配置參數&#…

無人機神經網絡模塊運行與技術難點

一、神經網絡模塊的運行方式 1. 分層處理架構 感知層 多模態數據融合&#xff1a;通過八元數卷積網絡&#xff08;OCNN&#xff09;統一處理LiDAR、攝像頭、IMU等異構傳感器數據&#xff0c;將點云坐標&#xff08;x/y/z&#xff09;、圖像RGB與光流信息編碼至8維虛部&#…

前端react框架實現打包時間動態加入配置展示在指定頁面

注意&#xff1a; 當前方法特定為 create-react-app 構建框架&#xff0c;其他的構建流程不同&#xff0c;不能直接照搬 react-scripts 的方式。 ? 目標&#xff1a; 在 React 打包&#xff08;build&#xff09;時&#xff0c;自動將當前時間寫入代碼中某個變量或 console…