深入理解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…