arkts-appstorage
介绍
AppStorage是在应用启动时创建的单例,用于提供应用状态数据的中心存储。这些状态数据在应用级别可访问。AppStorage在应用运行过程中保留其属性。
AppStorage中保存的属性通过唯一的字符串类型属性名(key)访问,该属性可以和UI组件同步,且可以在应用业务逻辑中被访问。
AppStorage支持应用的主线程内多个UIAbility实例间的UI状态数据共享。
AppStorage中的属性通过唯一的字符串类型key值访问,支持与UI组件同步,并可在应用业务逻辑中被访问。其支持应用的主线程内多个UIAbility实例间的UI状态数据共享。
效果预览
| 首页 | CustomDialogController_CAPI页面 | OpenCustomDialog_CAPI页面 |
|---|---|---|
![]() |
![]() |
![]() |
使用说明
- 安装编译生成的hap包,并打开应用;
- 首页面会出现页面列表,点击此列表项进入对应页面示例界面;
工程目录
PersistentStorage
entry
└── src
├── main
│ ├── ets
│ │ ├── entryability
│ │ │ └── EntryAbility.ets
│ │ ├── entrybackupability
│ │ │ └── EntryBackupAbility.ets
│ │ └── pages
│ │ ├── Index.ets
│ │ ├── PageEight.ets //示例8:emit接口不支持在Previewer预览器中使用
│ │ ├── PageFive.ets //示例5:装饰Map类型变量
│ │ ├── PageFour.ets //示例4:装饰Date类型变量
│ │ ├── PageNine.ets //示例9:三元表达式使用
│ │ ├── PageOne.ets //示例1:从应用逻辑使用AppStorage和LocalStorage
│ │ ├── PageSeven.ets //示例7:不建议借助@StorageLink的双向同步机制实现事件通知
│ │ ├── PageSix.ets //示例6:装饰Set类型变量
│ │ ├── PageTen.ets //示例10:@StorageProp和AppStorage接口配合使用时,需要注意更新规则
│ │ ├── PageThree.ets //示例3:AppStorage支持联合类型
│ │ └── PageTwo.ets //示例2:从UI内部使用AppStorage
│ ├── module.json5
│ └── resources
│ ├── base
│ │ ├── element
│ │ │ ├── color.json
│ │ │ ├── float.json
│ │ │ └── string.json
│ │ ├── media
│ │ │ ├── background.png
│ │ │ ├── foreground.png
│ │ │ ├── layered_image.json
│ │ │ └── startIcon.png
│ │ └── profile
│ │ ├── backup_config.json
│ │ └── main_pages.json
│ ├── dark
│ │ └── element
│ │ └── color.json
│ └── rawfile
├── mock
│ └── mock-config.json5
├── ohosTest
│ ├── ets
│ │ └── test
│ │ ├── Ability.test.ets
│ │ ├── Index.test.ets
│ │ └── List.test.ets
│ └── module.json5
│ └── ohosTest.md
└── test
├── List.test.ets
└── LocalUnit.test.ets
具体实现
- AppStorage 基础初始化与数据操作实现:通过AppStorage.setOrCreate('propA', 47)初始化全局状态(键propA,值 47),支持跨主线程内多个 UIAbility 共享;通过AppStorage.get('propA')获取值,AppStorage.set('propA', 100)修改值,且操作仅作用于运行内存,应用重启后未持久化的数据会丢失。
- @StorageProp 单向同步实现:组件内用@StorageProp('propA') storageProp: number = 1绑定 AppStorage 的propA,本地可修改(如this.storageProp += 1)但不回传 AppStorage;当 AppStorage 中propA更新(如AppStorage.set('propA', 100)),storageProp会被覆盖并触发组件刷新,且禁止从父组件初始化该变量。
- @StorageLink 双向同步实现:组件内用@StorageLink('propA') storageLink: number = 1绑定 AppStorage 的propA,本地修改(如this.storageLink += 1)会同步回 AppStorage;AppStorage 中propA更新时,所有绑定该键的@StorageLink和@StorageProp变量均会同步刷新,支持初始化子组件的@State/@Prop等状态。
- 联合类型(含 null/undefined)同步实现:API 12 + 支持@StorageLink('linkA') linkA: number | null = null或@StorageProp('propB') propB: number | undefined = undefined;点击文本可切换值(如this.linkA ? this.linkA = null : this.linkA = 1),值变化会同步(双向 / 单向)至 AppStorage,UI 实时展示当前类型值。
- Date 类型同步实现:API 12 + 支持@StorageLink('date') selectedDate: Date = new Date('2021-08-08');通过this.selectedDate.setFullYear(this.selectedDate.getFullYear() + 1)修改日期属性,或AppStorage.setOrCreate('date', new Date('2023-07-08'))直接更新 AppStorage,两者均能触发DatePicker组件 UI 刷新。
- Map 类型同步实现:API 12 + 支持@StorageLink('map') message: Map<number, string> = new Map([[0, 'a']]);通过this.message.set(4, 'd')(添加键值对)、this.message.clear()(清空)、AppStorage.get<Map<number, string>>('map')?.delete(0)(删除键)修改 Map,用ForEach(Array.from(this.message.entries()), ...)遍历展示,修改同步触发 UI 更新。
- Set 类型同步实现:API 12 + 支持@StorageLink('set') memberSet: Set = new Set([0,1,2]);通过this.memberSet.add(5)(新增元素)、this.memberSet.delete(0)(删除元素)、AppStorage.get<Set>('set')?.clear()(清空)修改 Set,遍历Array.from(this.memberSet.entries())展示,修改同步至 AppStorage 并刷新 UI。
- 与 LocalStorage 隔离使用实现:创建let storage: LocalStorage = new LocalStorage()实例,用storage.setOrCreate('propA', 17)初始化;AppStorage 与 LocalStorage 同名键(如propA)相互独立,AppStorage.get('propA')返回 47,storage.get('propA')返回 17,修改各自存储的值不影响对方。
- 避免 @StorageLink 事件通知性能问题实现:不使用@StorageLink双向同步传递事件(避免多组件不必要刷新),改用emitter接口;通过emitter.on(innerEvent, data => {...})订阅事件,emitter.emit(innerEvent, eventData)发送事件,仅目标组件接收回调,减少 UI 刷新开销(如 Gallery 图片选中态切换场景)。
- @StorageProp 与 AppStorage 同步一致性实现:若本地修改@StorageProp(如this.propA = true)后,用AppStorage.setOrCreate('propA', false)更新时,因 AppStorage 原值与新值相同,不会触发@StorageProp刷新;需改为@StorageLink(本地修改同步回 AppStorage),或直接通过AppStorage.setOrCreate('propA', true)修改,确保两者值一致。
相关权限
不涉及
依赖
不涉及
约束和限制
-
本示例仅支持标准系统上运行, 支持设备:华为手机。
-
HarmonyOS系统:HarmonyOS 5.0.5 Release及以上。
-
DevEco Studio版本:6.0.0 Release及以上。
-
HarmonyOS SDK版本:HarmonyOS 6.0.0 Release SDK及以上。
下载
如需单独下载本工程,执行如下命令:
git init
git config core.sparsecheckout true
echo ArkUISample/AppStorage > .git/info/sparse-checkout
git remote add origin https://gitcode.com/harmonyos_samples/guide-snippets.git
git pull origin master


