首页 > 其他分享 >HarmonyOS实践之应用状态变量共享

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

时间:2023-12-27 10:16:24浏览次数:28  
标签:ets AppStorage Index HarmonyOS LocalStorage 状态变量 共享 属性 页面

 

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

根据不同的使用场景,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
@Component
struct WidgetCard {
...

  

改之后:

let storage = new LocalStorage();
@Entry(storage)
@Component
struct 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()
@Component
struct 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()
@Component
struct Index {
  @StorageProp('persistentcount') persistentValue: number = 0;

  

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

@Entry
@Component
struct 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可以持久化存储数据信息。

标签:ets,AppStorage,Index,HarmonyOS,LocalStorage,状态变量,共享,属性,页面
From: https://www.cnblogs.com/HarmonyOSDev/p/17929855.html

相关文章

  • 【python爬虫课程设计】大数据分析——共享单车使用量可视化分析
    一、选题的背景共享单车在当今社会中扮演着重要角色,对城市交通、环境、个人出行习惯等方面产生了显著影响。通过分析这些数据,可以了解共享单车对城市生活的影响,对交通拥堵、空气质量改善、促进健康出行提供便利。通过分析共享单车数据,可以了解技术创新在这一领域的应用情况,探索改......
  • HarmonyOS应用兼容稳定性云测试
    HarmonyOS应用兼容稳定性云测试兼容性测试兼容性测试主要验证HarmonyOS应用在华为真机设备上运行的兼容性问题,包括首次安装、再次安装、启动、卸载、崩溃、黑白屏、闪退、运行错误、无法回退、无响应、设计约束场景。具体兼容性测试项的详细说明请参考兼容性测试标准。兼容性测试支......
  • HarmonyOS应用性能与功耗云测试
     性能测试性能测试主要验证HarmonyOS应用在华为真机设备上运行的性能问题,包括启动时长、界面显示、CPU占用和内存占用。具体性能测试项的详细说明请参考性能测试标准。性能测试支持Phone和TV设备,包格式包括Hap/App。前提条件● 已注册华为开发者帐号,并完成实名认证,具体......
  • 智能监控平台/视频共享融合系统EasyCVR海康设备国标GB28181接入流程
    TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快,可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等,以及支持厂家私有协议与SDK接入,包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力,也具备接入AI智能分析的能力,包括对人、车、......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.12.26)
    合集-网盘(20) 1.百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.17)11-182.记录一次自己写的百度网盘不限速下载脚本11-183.百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.20)11-214.百度网盘(百度云)SVIP超级会员共享账号每日更新(2023.11.21)11-215.百度网......
  • 扫描全能王启动鸿蒙原生应用开发,系HarmonyOS NEXT智能扫描领域首批
    近期,“鸿蒙合作签约暨扫描全能王鸿蒙原生应用开发启动仪式”(简称“签约仪式”)正式举行。合合信息与华为达成鸿蒙合作,旗下扫描全能王将基于HarmonyOSNEXT正式启动鸿蒙原生应用开发。据悉,扫描全能王是鸿蒙在智能扫描领域内签约原生应用开发的头部产品,双方拟在以OpenHarmony为底座......
  •  鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toast组件
     鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toast组件编辑一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Toast组件Toast 的应用场景也非常广泛,比如网络请求出错了可以弹一个 Toast 提示等。@ohos.prompt 模块里提供显示一个 Toast 的A......
  •  鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle开关组件
     鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之Toggle开关组件编辑一、操作环境操作系统: Windows10专业版、IDE:DevEcoStudio3.1、SDK:HarmonyOS3.1二、Toggle开关组件接口Toggle(options:{type:ToggleType,isOn?:boolean})参数参数名参数类型必填默认值参数描述typeToggleType......
  • Linux配置NFS文件共享
    一、NFS简介NFS是NetworkFileSystem的缩写,是一种分布式文件系统协议,用于在计算机网络上共享文件。它允许客户端计算机通过网络远程访问和处理远程服务器上的文件和目录。NFS最初由SunMicrosystems开发并在1984年发布,被设计为可在不同操作系统和硬件平台之间共享文件。它基于客户......
  • HarmonyOS应用事件打点开发指导
    HarmonyOS应用事件打点开发指导简介传统的日志系统里汇聚了整个设备上所有程序运行的过程流水日志,难以识别其中的关键信息。因此,应用开发者需要一种数据打点机制,用来评估如访问数、日活、用户操作习惯以及影响用户使用的关键因素等关键信息。HiAppEvent是在系统层面为应用开发者提......