应用级变量的状态管理在前面的章节中,已经讲述了如何管理页面级变量的状态,本章将说明如何管理应用级变量的状态,具体接口说明请参考应用级变量的状态管理接口。
appstorageappstorage是应用程序中的单例对象,由ui框架在应用程序启动时创建,在应用程序退出时销毁,为应用程序范围内的可变状态属性提供中央存储。
appstorage包含整个应用程序中需要访问的所有状态属性,只要应用程序保持运行,appstorage就会保存所有属性及属性值,属性值可以通过唯一的键值进行访问。
组件可以通过装饰器将应用程序状态数据与appstorage进行同步,应用业务逻辑的实现也可以通过接口访问appstorage。
appstorage的选择状态属性可以与不同的数据源或数据接收器同步,这些数据源和接收器可以是设备上的本地或远程,并具有不同的功能,如数据持久性。这样的数据源和接收器可以独立于ui在业务逻辑中实现。
默认情况下,appstorage中的属性是可变的,appstorage还可使用不可变(只读)属性。
说明:worker和主线程只能通过postmessage交互,不能使用appstorage进行交互。
@storagelink装饰器组件通过使用@storagelink(key)装饰的状态变量,与appstorage建立双向数据绑定,key为appstorage中的属性键值。当创建包含@storagelink的状态变量的组件时,该状态变量的值将使用appstorage中的值进行初始化。在ui组件中对@storagelink的状态变量所做的更改将同步到appstorage,并从appstorage同步到任何其他绑定实例中,如persistentstorage或其他绑定的ui组件。
@storageprop装饰器组件通过使用@storageprop(key)装饰的状态变量,与appstorage建立单向数据绑定,key标识appstorage中的属性键值。当创建包含@storageprop的状态变量的组件时,该状态变量的值将使用appstorage中的值进行初始化。appstorage中属性值的更改会导致绑定该状态变量的ui组件进行状态更新。
示例每次用户单击count按钮时,this.vara变量值都会增加1,此变量与appstorage中的vara同步。每次用户单击language按钮时,修改appstorage中的languagecode,此修改会同步给this.languagecode变量。
// xxx.ets@entry@componentstruct componenta { @storagelink('vara') vara: number = 2 @storageprop('languagecode') languagecode: string = 'en' private label: string = 'count' abouttoappear() { this.label = (this.languagecode === 'zh') ? '数量' : 'count' } build() { column() { row({ space: 20 }) { button(`${this.label}: ${this.vara}`) .onclick(() = > { appstorage.set('vara', appstorage.get('vara') + 1) }) button(`language: ${this.languagecode}`) .onclick(() = > { if (appstorage.get('languagecode') === 'zh') { appstorage.set('languagecode', 'en') } else { appstorage.set('languagecode', 'zh') } this.label = (this.languagecode === 'zh') ? '数量' : 'count' }) } .margin({ top: 50, bottom: 50 }) row() { button(`更改@storagelink修饰的变量:${this.vara}`).height(40).fontsize(14) .onclick(() = > { this.vara++ }) } }.width('100%') }}localstorage说明:
该接口从api version 9开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
localstorage是应用程序中的存储单元,生命周期跟随其关联的ability。在stage模型下,localstorage解决appstorage共享范围过大的问题,提供ability之间全局数据的隔离。同时,localstorage为应用程序范围内的可变状态属性和非可变状态属性提供存储,可变状态属性和非可变状态属性是构建应用程序ui的一部分,如一个ability的ui。解决app与ability之间数据互相干扰问题,多实例场景下同一个ability类的不同ability实例之间的数据互相干扰问题。在分布式迁移的场景下,ability是系统调度的最小单元,配合localstorage更方便实现组件的数据迁移。
应用层:一个应用程序可以创建多个localstorage实例,应用程序的每一个ability对应一个localstorage实例。
ability:一个应用程序可以拥有多个ability,一个ability中的所有子组件最多可以分配一个localstorage实例。并且,ability中的所有子组件都将继承对此localstorage实例存储对象的访问权。
一个组件最多可以访问一个localstorage实例,一个localstorage对象可以分配给多个组件。
@localstoragelink装饰器组件通过使用@localstoragelink(key)装饰的状态变量,key值为localstorage中的属性键值,与localstorage建立双向数据绑定。当创建包含@localstoragelink的状态变量的组件时,该状态变量的值将会使用localstorage中的值进行初始化。如果localstorage中未定义初始值,将使用@localstoragelink定义的初始值。在ui组件中对@localstoragelink的状态变量所做的更改将同步到localstorage中,并从localstorage同步到ability下的组件中。
@localstorageprop装饰器组件通过使用localstorageprop(key)装饰的状态变量,key值为localstorage中的属性键值,与localstorage建立单向数据绑定。当创建包含@localstorageprop的状态变量的组件时,该状态变量的值将使用localstorage中的值进行初始化。localstorage中的属性值的更改会导致当前ability下的所有ui组件进行状态更新。
说明:创建localstorage实例时如未定义初始值,可以使用组件内@localstoragelink和@localstorageprop的初始值。如果定义时给定了初始值,那么不会再使用@localstoragelink和@localstorageprop的初始值。
示例1(在一个ability中创建localstorage)localstorage通过loadcontent接口加载
import uiability from '@ohos.app.ability.uiability';export default class entryability extends uiability { storage: localstorage oncreate() { this.storage = new localstorage() this.storage.setorcreate('storagesimpleprop', 121) console.info('[demo entryability oncreate]') } ondestroy() { console.info('[demo entryability ondestroy]') } onwindowstagecreate(windowstage) { // storage作为参数传递给loadcontent接口 windowstage.loadcontent('pages/index', this.storage) } onwindowstagedestroy() { console.info('[demo] entryability onwindowstagedestroy') } onforeground() { console.info('[demo] entryability onforeground') } onbackground() { console.info('[demo] entryability onbackground') }}@component组件获取数据
// index.etslet storage = localstorage.getshared()@entry(storage)@componentstruct localstoragecomponent { @localstoragelink('storagesimpleprop') simplevarname: number = 0 build() { column() { button(`localstoragelink: ${this.simplevarname.tostring()}`) .margin(20) .onclick(() = > { this.simplevarname += 1 }) text(json.stringify(this.simplevarname)) .fontsize(50) localstoragecomponentprop() }.width('100%') }}@componentstruct localstoragecomponentprop { @localstorageprop('storagesimpleprop') simplevarname: number = 0 build() { column() { button(`localstorageprop: ${this.simplevarname.tostring()}`) .margin(20) .onclick(() = > { this.simplevarname += 1 }) text(json.stringify(this.simplevarname)) .fontsize(50) }.width('100%') }}
示例2(在entry页面定义localstorage)
// xxx.etslet storage = new localstorage({ propa: 47 })@entry(storage)@componentstruct coma { @localstoragelink(propa) storagelink: number = 1 build() { column() { text(`parent from localstorage ${this.storagelink}`) .fontsize(18) .margin(20) .onclick(() = > this.storagelink += 1) child() } }}@componentstruct child { @localstoragelink(propa) storagelink: number = 1 build() { text(`child from localstorage ${this.storagelink}`) .fontsize(18) .margin(20) .onclick(() = > this.storagelink += 1) }}
persistentstoragepersistentstorage提供了一些静态方法用来管理应用持久化数据,可以将特定标记的持久化数据链接到appstorage中,并由appstorage接口访问对应持久化数据,或者通过@storagelink装饰器来访问对应key的变量。
说明:
persistentstorage的persistprop接口使用时,需要保证输入对应的key在appstorage中存在。persistentstorage的deleteprop接口使用时,只能对本次应用启动时已经link过的数据生效。// xxx.etspersistentstorage.persistprop('highscore', '0')@entry@componentstruct persistentcomponent { @storagelink('highscore') highscore: string = '0' @state currentscore: number = 0 build() { column() { if (this.currentscore === number(this.highscore)) { text(`new highscore : ${this.highscore}`).fontsize(18) } button(`goal!, currentscore : ${this.currentscore}`) .margin(20) .onclick(() = > { this.currentscore++ if (this.currentscore > number(this.highscore)) { this.highscore = this.currentscore.tostring() } }) }.width('100%') }}
environmentenvironment是框架在应用程序启动时创建的单例对象,它为appstorage提供了一系列应用程序需要的环境状态数据,这些数据描述了应用程序运行的设备环境,包括系统语言、深浅色模式等等。environment及其属性是不可变的,所有数据类型均为简单类型。如下示例展示了从environment获取系统是否开启无障碍屏幕朗读:
environment.envprop('accessibilityenabled', 'default')var enable = appstorage.get('accessibilityenabled')accessibilityenabled是environment提供的系统默认变量识别符。首先需要将对应系统属性绑定到appstorage上,再通过appstorage中的方法或者装饰器访问对应的系统属性数据。
研发突破性的纳米级电子“纹身”传感器可以附着在单个细胞上
X-Window系统介绍
探讨机器人行业的未来发展与时代机遇
台积电已将华为海思原本预订的第四季先进制程产能撤销
中国移动竞夺CDMA集团用户方案曝光
Harmony 鸿蒙应用级变量的状态管理
小米电视4S登陆欧洲,配备4K HDR屏幕和MEMC技术
HarmonyOS 荣获两项红点设计大奖
以智能音箱为主的智能硬件持续增长 交互模式也从单模态向多模态转变
计算机房机房温湿度监控要怎么样选择传感器?
IXXAT NT系列高稳定性网关网桥解决方案
用于二维波束扫描的集成铌酸锂光学相控阵
AC7840x三电机控制应用解决方案
雷蛇宣布将推出支持触觉反馈的耳机
如何用铅笔判断电视机内有无高压
AI给生活带来了什么便利
让你随时随地都能知道天气情况的传感器
关于RFID的仓库管理系统的方案设计
韩国5G市场的运营现状与发展战略分析
Python协程与JavaScript协程的对比及经验技巧