玩转HarmonyOS NEXT之AppStorage应用全局UI状态存储

概述

AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。

AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。

本文仅介绍AppStorage使用场景和相关的装饰器:@StorageProp@StorageLink

@StorageProp

如果要建立AppStorage和自定义组件的联系,需要使用@StorageProp@StorageLink装饰器。使用@StorageProp(key)/@StorageLink(key)装饰组件内的变量,key标识了AppStorage的属性。

装饰器使用规则说明

@StorageProp变量装饰器 说明
装饰器参数 key:常量字符串,必填(字符串需要有引号)。
允许装饰的变量类型 Objectclassstringnumberbooleanenum类型,以及这些类型的数组。
同步类型 单向同步 :从AppStorage的对应属性到组件的状态变量。 组件本地的修改是允许的,但是AppStorage中给定的属性一旦发生变化,将覆盖本地的修改。
被装饰变量的初始值 必须指定,如果AppStorage实例中不存在属性,则用该初始值初始化该属性,并存入AppStorage中。

变量的传递/访问规则说明

传递/访问 说明
从父节点初始化和更新 禁止@StorageProp不支持从父节点初始化,只能AppStoragekey对应的属性初始化,如果没有对应key的话,将使用本地默认值初始化
初始化子节点 支持,可用于初始化@State@Link@Prop@Provide
是否支持组件外访问

监听变化和行为表现

监听变化

  • 当装饰的数据类型为booleanstringnumber类型时,可以监听到数值的变化。
  • 当装饰的数据类型为class或者Object时,可以监听到对象整体赋值对象属性变化。
  • 当装饰的对象是array时,可以监听到数组添加、删除、更新数组单元的变化。
  • 当装饰的对象是Date时,可以监听到Date整体的赋值,同时可通过调用Date的接口setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds, setTime, setUTCFullYear, setUTCMonth, setUTCDate, setUTCHours, setUTCMinutes, setUTCSeconds, setUTCMilliseconds更新Date的属性。
  • 当装饰的变量是Map时,可以监听到Map整体的赋值 ,同时可通过调用Map的接口set, clear, delete 更新Map的值。
  • 当装饰的变量是Set时,可以观察到Set整体的赋值 ,同时可通过调用Set的接口add, clear, delete 更新Set的值。

框架行为

  • @StorageProp(key)装饰的数值改变被监听到时,修改不会被同步回·AppStorage`对应属性键值key的属性中。
  • 当前@StorageProp(key)单向绑定的数据会被修改,即仅限于当前组件的私有成员变量改变,其他的绑定该key的数据不会同步改变。
  • @StorageProp(key)装饰的数据本身是状态变量,它的改变虽然不会同步回AppStorage中,但是会引起所属的自定义组件的重新渲染。
  • AppStoragekey对应的属性发生改变时,会同步给所有@StorageProp(key)装饰的数据,@StorageProp(key)本地的修改将被覆盖。

@StorageLink(key)是和AppStorage中key对应的属性建立双向数据同步:

  • 本地修改发生,该修改会被写回AppStorage中;
  • AppStorage中的修改发生后,该修改会被同步到所有绑定AppStorage对应key的属性上,包括单向(@StorageProp和通过Prop创建的单向绑定变量)、双向(@StorageLink和通过Link创建的双向绑定变量)变量和其他实例(比如PersistentStorage)。

装饰器使用规则说明

@StorageLink变量装饰器 说明
装饰器参数 key:常量字符串,必填(字符串需要有引号)。
允许装饰的变量类型 Objectclassstringnumberbooleanenum类型,以及这些类型的数组。
同步类型 双向同步:从AppStorage的对应属性到自定义组件,从自定义组件到AppStorage对应属性。
被装饰变量的初始值 必须指定,如果AppStorage实例中不存在属性,则用该初始值初始化该属性,并存入AppStorage中。

变量的传递/访问规则说明

传递/访问 说明
从父节点初始化和更新 禁止。
初始化子节点 支持,可用于初始化常规变量、@State@Link@Prop@Provide
是否支持组件外访问

监听变化和行为表现

监听变化

  • 当装饰的数据类型为booleanstringnumber类型时,可以监听到数值的变化。
  • 当装饰的数据类型为class或者Object时,可以监听到对象整体赋值对象属性变化。
  • 当装饰的对象是array时,可以监听到数组添加、删除、更新数组单元的变化。
  • 当装饰的对象是Date时,可以监听到Date整体的赋值,同时可通过调用Date的接口setFullYear, setMonth, setDate, setHours, setMinutes, setSeconds, setMilliseconds, setTime, setUTCFullYear, setUTCMonth, setUTCDate, setUTCHours, setUTCMinutes, setUTCSeconds, setUTCMilliseconds更新Date的属性。
  • 当装饰的变量是Map时,可以监听到Map整体的赋值 ,同时可通过调用Map的接口set, clear, delete 更新Map的值。
  • 当装饰的变量是Set时,可以观察到Set整体的赋值 ,同时可通过调用Set的接口add, clear, delete 更新Set的值。

框架行为

  • @StorageProp(key)装饰的数值改变被监听到时,修改将被同步回·AppStorage`对应属性键值key的属性中。
  • AppStorage中属性键值key对应的数据一旦改变,属性键值key绑定的所有的数据(包括双向@StorageLink和单向@StorageProp)都将同步修改。
  • @StorageLink(key)装饰的数据本身是状态变量,它的改变不仅仅会同步回AppStorage中,还会引起所属的自定义组件的重新渲染。
相关推荐
nashane7 小时前
HarmonyOS 6学习:CapsLock键失效诊断与长截图完整实现指南
学习·华为·harmonyos
richard_yuu9 小时前
鸿蒙心理测评模块实战|PHQ-9/GAD7双量表答题、实时计分与结果本地化存储
华为·harmonyos
不爱吃糖的程序媛12 小时前
2026年Electron 鸿蒙PC环境搭建指南
人工智能·华为·harmonyos
nashane12 小时前
HarmonyOS 6学习:长截图功能开发中的滚动拼接与权限处理实战
人工智能·华为·harmonyos
大师兄666813 小时前
从零开发一个 HarmonyOS 输入法——KikaInputMethod 完整拆解
harmonyos·服务卡片·harmonyos6·formkit
Python私教18 小时前
鸿蒙 NEXT 也能接 MCP?用 ArkTS 跑通 AI Agent 工具链
人工智能·华为·harmonyos
Swift社区21 小时前
分布式能力在鸿蒙 PC 上到底怎么用?
分布式·华为·harmonyos
nashane1 天前
HarmonyOS 6学习:外接键盘CapsLock与长截图功能的实战调试与完整解决方案
学习·华为·计算机外设·harmonyos
aqi002 天前
一文理清 HarmonyOS 6.0.2 涵盖的十个升级点
android·华为·harmonyos·鸿蒙·harmony