HarmonyOS 实践之应用状态变量共享

HarmonyOS开发实践:ArkTS应用状态变量共享 我们要在EntryFormAbility.ets中通过传递LocalStorage改变服务卡片中的默认Hello的文本标签为当前时间。 阅读详情

平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息。虽然常用的共享信息,也可以通过不同页面中组件间信息共享的方式,但有时使用应用级别的状态管理会让开发工作变得简单。

根据不同的使用场景,ArkTS 提供了以下几种应用状态管理的能力:

○ LocalStorage:使用范围在同一页面,页面与卡片和页面与 UIAbility 内部,负责 UI 状态存储。

○ AppStorage:运行时存储,保存在内存中,应用范围全局共享,提供统一的存储供所有页面访问。

○ PersistentStorage:持久化存储,保存在硬盘上,在应用退出或重启后,数据依旧保留。

下面通过简单的程序示例,熟悉一下这三种用法。其中示例程序中包含了以下主要文件:

一、LocalStorage

页面级的 UI 状态存储,同一个页面共享同一个 LocalStorage,不同的页面都可以绑定对应的 LocalStorage。最常用的就是更新服务卡片和跨页面的信息传递。

场景一:更新服务卡片

服务卡片中被 @Entry 装饰的 @Component,可以被分配一个 LocalStorage 实例,在组件内部,通过 @LocalStorageProp 装饰器定义本地变量,并绑定到对应组件上。更新卡片时,先定义一个包含了和 LocalStorageProp 属性同名的参数并放到 formBindingData 中,然后通过 formProvider.updateForm 函数,就可以更新服务卡片了。

我们要在 EntryFormAbility.ets 中通过传递 LocalStorage 改变服务卡片中的默认 Hello 的文本标签为当前时间。

实践步骤:

1.修改服务卡片布局文件,文件开头添加:

let storage = new LocalStorage();

并为 Entry 增加参数 storage。

例如,WidgetCard.ets,默认:

@Entry@Componentstruct WidgetCard {...

改之后:

let storage = new LocalStorage();@Entry(storage)@Componentstruct WidgetCard {...

2.在 EntryFormAbility.ets 中,用装饰器 LocalStorageProp 定义本地变量,装饰器的参数必须要和 formBindingData 中的属性名称相同。

例如,在接收方服务卡片中定义如下:

@LocalStorageProp('localprop') localValue: string = 'Hello';

卡片标签默认显示了 Hello。

在发送方 EntryFormAbility.ts 文件的 onFormEvent 函数里:

onFormEvent(formId, message) {
  let date = new Date();
  let str = date.getHours().toString().padStart(2, '0') + ':' +  date.getMinutes().toString().padStart(2, '0') + ':' + date.getSeconds().toString().padStart(2, '0')
  let formData = {
    'localprop': 'Time: ' + str,
  };
  let formInfo = formBindingData.createFormBindingData(formData)
  formProvider.updateForm(formId, formInfo).then((data) => {
    console.info('FormAbility updateForm success.' + JSON.stringify(data));
  }).catch((error) => {
    console.error('FormAbility updateForm failed: ' + JSON.stringify(error));
  })
}

formData 对象里包含了名称为 localprop 的键值,它通过 formBindingData 由 formProvider 传递给服务卡片,服务卡片接收到该对象后,就自动把该对象赋值给 LocalStorage,相应的 LocalStorageProp 也自动跟着刷新。

这个动作是通过点击卡片上的 update 按钮,触发了 postCardAction 事件从而调用了 onFormEvent 函数,执行结果如下:

场景二:跨页面的信息传递

在页面初次加载时,可以在 EntryAbility.ts 中传递一个 LocalStorage 对象给要打开的页面。

我们打算在 index.ets 页面加载的时候,在 EntryAbility 中传递一个包含 abilitycount 值为 1 的 Storage,页面加载后界面显示该值。

实践步骤:

1.在 EntryAbility.ts 中定义一个 LocalStorage 类型的变量,里面包含 abilitycount 属性。

export default class EntryAbility extends UIAbility {  storage: LocalStorage = new LocalStorage({    'abilitycount': 1  });

在 onWindowStageCreate 函数中,将默认的:

windowStage.loadContent('pages/Index', (err, data) => {

改为传递参数的方式,如下:

windowStage.loadContent('pages/Index', this.storage);

2.在页面端 Index.ets 中,文件开头添加代码来获取共享的 LocalStorage。

let storage = LocalStorage.GetShared()

在结构体内部,通过装饰器 LocalStorageProp 加同样属性名称作为参数,定义一个变量。

@LocalStorageProp('abilitycount') abilityCount: number = 0;

这样名为 abilitycount 的值就通过 LocalStorage 传递到页面了,本地默认的值 0 变为了传递过来的值 1。

下图中 LocalStorage 的值就是页面打开时显示的传递过来的值。

二、AppStorage

全局的 UI 状态存储,在运行时阶段可以在不同的页面间共享信息。我们通过在 Index.ets 页面创建一个变量放到 AppStorage 中,然后分别在 First.ets 页面和 Second.ets 页面访问和修改。

实践步骤:

1.首先在 Index.ets 中,通过 AppStorage 定义一个属性。

AppStorage.SetOrCreate('appcount', 10);

然后,在组件结构体中使用 StorageProp 装饰器定义一个变量,参数为之前定义的 appcount 属性。

@Entry()@Componentstruct Index {

  @StorageProp('appcount') appValue: number = 0;

2.在 First.ets 页面中,通过 StorageProp 定义一个 appValue 变量,关联到 appcount 属性上。

struct First {  @StorageProp('appcount') appValue: number = 0;

在本地修改时,把用户输入的值写入 AppStorage,使用如下语句:

AppStorage.Set('appcount', this.textApp);

Second.ets 页面与 First.ets 页面功能完全相同,主要显示 AppStorage 在不同页面显示和修改的效果。

如下图,主页面、第一个页面和第二个页面初始状态下,读取到的 AppStorage 中的同一个属性的值都是 10。

在第一个页面 First.ets 中把 AppStorage 中的属性值改为 11,我们发现在主页面 Index.ets 和 Second.ets 中,对应的属性值都发生了变化。

同样,在第二个页面 Second.ets 中把 AppStorage 中的属性值改为 12,我们发现在 Index.ets 和 First.ets 中,对应的属性值也都变为了改后的值。

如上测试,我们发现的确可以通过 AppStorage 在不同页面间共享数据。

三、PersistentStorage

持久化存储 UI 状态。保存在 PersistentStorage 中的数据,即使应用退出了,对应的值依然会保留,不是在内存中,而是存储在固定存储介质上的。

我们通过在 Index.ets 页面创建一个属性放到 PersistentStorage 中,然后分别在 First.ets 页面和 Second.ets 页面进行修改,然后再重启应用观察结果。

实践步骤:

1.首先在 Index.ets 中,在 PersistentStorage 里定义一个属性。

PersistentStorage.PersistProp('persistentcount', 100);

然后在组件结构体中,通过装饰器 StorageProp 定义一个属性为 persistentcount 的变量。

@Entry()@Componentstruct Index {  @StorageProp('persistentcount') persistentValue: number = 0;

2.在 First.ets 页面中,我们通过装饰器 StorageProp 定义一个变量绑定 persistentcount 属性。

@Entry@Componentstruct First {  @StorageProp('persistentcount') persistentValue: number = 0;

通过输入框输入新值改变原来存储在 PersistentStorage 的内容。

AppStorage.Set('persistentcount', this.textPersistent);

演示效果如下图,Index.ets 页面,在初始时 AppStorage 和 PersistentStorage 中的对应属性值分别是 10 和 100,在 First.ets 页面中,我们分别改为 11 和 111。

关闭应用,然后重新打开,如下图所示,AppStorage 中的属性值恢复为了 10,PersistentStorage 中的属性值依旧是 111,是改后的值。这证明了 PersistentStorage 有持续化存储的作用。

四、总结

通过这次实践,熟悉了不同的状态变量在应用中的不同应用范围,选用合适的状态变量会让应用开发简单快捷,本地页面内部使用 LocalStorage 保存数据,应用页面间通过 AppStorage 传递信息,PersistentStorage 可以持久化存储数据信息。

鸿蒙Harmony应用开发—ArkTS-应用级变量的状态管理 状态管理模块提供了应用程序的数据存储能力、持久化数据管理能力、UIAbility数据存储能力和应用程序需要的环境状态。 阅读详情

相关推荐

HarmonyOS NEXT应用开发之PersistentStorage:持久化存储UI状态

PersistentStorage将选定的AppStorage属性保留在设备磁盘上。应用程序通过API,以决定哪些AppStorage属性应借助PersistentStorage持久化。UI和业务逻辑不直接访问PersistentStorage中的属性,所有属性访问都是对AppStorage的访问,AppStorage中的更改会自动同步到PersistentStorage。PersistentStorage和AppStorage中的属性建立双向同步。

1 3051

HarmonyOS | 状态管理(八) | PersistentStorage(持久化存储UI状态)

PersistentStorage的作用是:应用退出再次启动后,依然能保存选定的结果。

让 学习 成为一种 习惯 ( 谭祖爱 & 技术博客 ) 2610

鸿蒙OS开发实例:【应用状态变量共享】

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造的《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点如果。

m0_62167422的博客 1990

构建第一个ArkTS应用之@AppStorage:应用全局的UI状态存储

AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。AppStorage可以和UI组件同步,且可以在应用业务逻辑中被访问。AppStorage中的属性可以被双向同步,数据可以是存在于本地或远程设备上,并具有不同的功能,比如数据持久化(详见这些数据是通过业务逻辑中实现,与UI解耦,如果希望这些数据在UI中使用,需要用到和。

二当家的 1753

HarmonyOS NEXT应用开发:ArkTS语言状态管理-LocalStorage:页面级UI状态存储

本文仅介绍LocalStorage使用场景和相关的装饰器:@LocalStorageProp和@LocalStorageLink。

ZPYQAQ的博客 1161

HarmonyOS 5.0.0 或以上:实现跨页面数据共享(使用 @AppStorage 全局状态)

在中大型应用中,经常会遇到以下问题:页面 A 修改了某个状态(如用户昵称、主题色)页面 B、C、D 需要自动感知并响应变化不方便通过参数传递,适合使用全局状态管理本篇将使用 HarmonyOS 提供的装饰器,快速实现:跨页面共享状态变量实时响应其他页面变更无需手动传参、路由监听。

2501_92049284的博客 419

【开发者说】HarmonyOS实践之应用状态变量共享_鸿蒙退出应用 localstorage的数据还在吗

formData对象里包含了名称为localprop的键值,它通过formBindingData由formProvider传递给服务卡片,服务卡片接收到该对象后,就自动把该对象赋值给LocalStorage,相应的LocalStorageProp也自动跟着刷新。我们打算在index.ets页面加载的时候,在EntryAbility中传递一个包含abilitycount值为1的Storage,页面加载后界面显示该值。

tencentes的博客 798

深入理解ArkTs中的AppStorage和LocalStorage

通过深入理解ARKTS中的AppStorage和LocalStorage,我们能够更好地利用这两个特性进行应用状态的管理和共享。合理使用这些工具,可以提高代码的可维护性和性能,使得开发更加高效。在实际开发中,根据具体需求和场景选择合适的状态管理方式,将有助于构建更健壮、可扩展的HarmonyOS应用。ARKTS中的AppStorage和LocalStorage为开发者提供了强大的状态管理工具,使得应用程序能够高效地共享和管理状态数据。

一键难忘的博客 2195

【开发者说】HarmonyOS实践之应用状态变量共享

通过这次实践,熟悉了不同的状态变量在应用中的不同应用范围,选用合适的状态变量会让应用开发简单快捷,本地页面内部使用LocalStorage保存数据,应用页面间通过AppStorage传递信息,PersistentStorage可以持久化存储数据信息。平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息。同样,在第二个页面Second.ets中把AppStorage中的属性值改为12,我们发现在Index.ets和First.ets中,对应的属性值也都变为了改后的值。持久化存储UI状态。

爱蹦跶的全栈大A阿 370

【STM32开源实战】基于STM32的智能输液监控系统设计与实现

本文详细介绍了基于STM32F103C8T6主控芯片的智能输液监控系统设计与实现。该系统通过光学液位传感器、温度传感器和红外滴速检测模块实时监测输液状态,利用步进电机自动调节滴速,并通过蓝牙实现数据远程传输,为医院提供了一套低成本、高可靠性的智能输液解决方案。

h6i7j8的博客 761

OASIS协议标准文档的解读_第一部分

OASIS标准协议的文档的解读。完整原协议的中文翻译和解读。

洋葱的专栏 4903

鸿蒙HarmonyOS 5.0开发:AppStorageV2: 应用全局UI状态存储

为了增强状态管理框架对应用全局UI状态变量存储的能力,开发者可以使用AppStorageV2存储应用全局UI状态变量数据。

m0_73088370的博客 1361

aruco_ros实战:从USB摄像头到Marker位姿检测全流程解析

本文详细解析了使用aruco_ros从USB摄像头实现ArUco Marker检测与位姿估计的全流程。内容涵盖环境搭建、核心launch文件配置、可视化调试、位姿数据解析以及深度优化技巧,帮助开发者快速掌握ROS下的视觉定位关键技术,并集成到机器人项目中。

weixin_29230805的博客 265

鸿蒙5:应用状态共享

【鸿蒙ArkTS状态管理指南】本文详细介绍了HarmonyOS应用开发中的两种状态管理方案: AppStorageV2:全局UI状态存储方案,支持多UIAbility实例共享数据,提供connect/remove/keys等核心方法,并通过登录案例演示了跨页面状态共享的实现 PersistenceV2:持久化存储方案,在AppStorageV2基础上增加磁盘存储能力,确保应用重启后数据不丢失。 关键特性包括: 类型安全的数据存取(需配合@ObservedV2和@Trace装饰器) 自动/手动持久化控制 25

qq_56760790的博客 1206

华大 HC32F460 DMA数据传输实战:从配置到中断处理的完整指南

本文提供了华大半导体HC32F460微控制器DMA(直接内存访问)功能的完整实战指南。详细解析了DMA的配置流程、中断处理机制以及软件与硬件触发方式,并附有实验代码示例。通过合理使用DMA进行数据传输,可以显著解放CPU资源,提升嵌入式系统的实时性与运行效率。

weixin_29194255的博客 255

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照

C#中的Chart控件——当数据源很多时可以显示进度条拉动观察,也可以记录到后台文本详细对照下面进行详细步骤说明,感兴趣的同学可以看一下: 1简单示例(一条线): 2.数据源随着时间不断变化,进度条变化 。多条线: 3.看在整段时期内的数据大体图(消去或出现)进度条: 4.后台将时刻记录变化记录到一个txt文本里以供详细校验: 话不多说上码: using System; using Sys...

帅boy的博客 4308

HamronyOS开发5.0【应用状态变量共享】

平时在开发的过程中,我们会在应用中共享数据,在不同的页面间共享信息。虽然常用的共享信息,也可以通过不同页面中组件间信息共享的方式,但有时使用应用级别的状态管理会让开发工作变得简单。

2401_82772199的博客 961

SpringBoot 系列教程(二):SpringBoot使用Devtools实现热部署

1.devtools   spring为开发者提供了一个名为spring-boot-devtools的模块来使Spring Boot应用支持热部署,提高开发者的开发效率,无需手动重启Spring Boot应用。 2.项目搭建   本文是采用IDEA搭建的Spring Boot应用,通过spring-boot-devtools配置,可以支持修改java文件会自动重启程序,一些资源无需触发重启,...

Thinkingcao的专栏 1216

鸿蒙5:组件状态共享

【鸿蒙ArkTS组件状态共享详解】本文系统介绍了HarmonyOS ArkTS中的组件状态管理方案: 父子组件通信 使用@Param实现单向父传子 结合@Event实现子向父回调 @Local本地状态管理 双向绑定语法糖(!!后缀) 跨代组件共享 @Provider/@Consumer实现跨层级数据共享 支持aliasName别名机制 可配合@Trace装饰器监听对象属性变化 支持方法共享回调 状态监听 @Monitor装饰器深度监听状态变化 对比@Watch的差异化能力 支持多属性联合监听 综合案例 通过

qq_56760790的博客 1170

核心面试聚焦:业务问题+系统问题+设计题---字节、阿里、美团等整理统计

业务系统及其他相关面试问题整理:线上相关问题排查+高并发系统的限流+高并发秒杀系统设计+负载均衡+一个网站有 20 亿 url 存在一个黑名单中,这个黑名单要怎么存?若此时随便输入一个 url,你如何快速判断该 url 是否在这个黑名单中?并且需在给定内存空间(比如:500M)内快速判断出?

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 172万+

人形机器人开源资源大盘点(四):硬件开源平台

开源人形机器人平台推动技术民主化 本期聚焦四大开源人形机器人平台:斯坦福的ToddlerBot以6000美元低成本实现30自由度运动,支持仿真到现实的零样本迁移;法国Reachy2被HuggingFace收购,融合开源AI与硬件,适配医疗、工业等场景;国内OriginMan基于ROS2全开源,集成大模型能力,支持深度改造;OAN框架则为经典NAO机器人注入开源活力,扩展交互功能。这些平台通过不同路径降低研发门槛,推动人形机器人技术走向开放共享的未来。

Studying…… 370

【HarmonyOS 4.0】应用级变量的状态管理

应用级变量的状态管理:LocalStorage、AppStorage、PersistentStorage、Environment

票票的博客 1287

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

HarmonyOS NEXT 实战系列07-应用状态

AppStorage的目的是为了给开发者提供更大范围的跨 Ability 基本的数据共享。其持久化和读回UI的能力都需要依赖 AppStorage。

zsgzsgzsgzsgzsg的博客 323

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HarmonyOS 状态管理最佳实践:装饰器选择 + 性能优化全解析

本文探讨了HarmonyOS ArkUI开发中的状态管理优化策略。文章指出状态变量装饰器选择不当会导致性能问题,提出了四个关键优化方向:合理选择装饰器、避免不必要的状态变量、最小化状态共享范围和精细化拆分复杂状态。通过对比反例和正例,强调应根据变量使用场景选择装饰器,推荐优先使用@State+@Prop/Link/ObjectLink等局部共享方案而非全局方案,并建议通过临时变量批量修改状态以减少UI刷新次数。文章还分类讨论了组件内独享和组件间共享两种状态管理场景,提供了六种共享方案及其适用范围的对比表格。

weixin_42299977的博客 387

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

上一篇: HarmonyOS应用性能与功耗云测试
下一篇: 【鸿蒙千帆起】《钢岚》成为首款基于 HarmonyOS NEXT 开发的战棋新游
「已注销」
博客等级 码龄5年 1045粉丝 297原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值