AppStorage:应用全局的UI状态存储
AppStorage是应用全局的UI状态存储,是和应用的进程绑定的,由UI框架在应用程序启动时创建,为应用程序UI状态属性提供中央存储。
概述
AppStorage是在应用启动的时候会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorage将在应用运行过程保留其属性。属性通过唯一的键字符串值访问。
AppStorage可以和UI组件同步,且可以在应用业务逻辑中被访问。
AppStorage中的属性可以被双向同步,数据可以是存在于本地或远程设备上,并具有不同的功能,比如数据持久化(详见PersistentStorage)。这些数据是通过业务逻辑中实现,与UI解耦,如果希望这些数据在UI中使用,需要用到@StorageProp和@StorageLink。
@StorageProp
@StorageProp(key)是和AppStorage中key对应的属性建立单向数据同步,我们允许本地改变的发生,但是对于@StorageProp,本地的修改永远不会同步回AppStorage中,相反,如果AppStorage给定key的属性发生改变,改变会被同步给@StorageProp,并覆盖掉本地的修改。
@Entry
@Component
struct StoragePropPage {
// 必须本地初始化
//禁止,@StorageProp不支持从父节点初始化,只能AppStorage中key对应的属性初始化,如果没有对应key的话,将使用本地默认值初始化
@StorageProp('count') count: number = 1
build() {
Column(){
Text(`count=${this.count}`)
.fontSize(30)
.margin({
top: 20
})
Button(){
Text(`设置StorageProp值`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
AppStorage.Set<number>("count",AppStorage.Get<number>("count")+1)
// AppStorage为同步到 count属性
}).margin({
top:20
})
Button(){
Text(`获StorageProp取值`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
let tempCount=AppStorage.Get<number>("count")
console.log(tempCount.toString())
}).margin({
top:20
})
Button(){
Text(`改变变量Count的值`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
// 这里更改count 不会同步到 AppStorage
this.count++
}).margin({
top:20
})
}.width('100%').height('100%')
}
}
组件通过使用@StorageProp(key)装饰的状态变量,将与AppStorage建立单向数据绑定,key标识 AppStorage中的属性键值。当创建包含@StoageProp的状态变量的组件时,该状态变量的值将使用 AppStorage中的值进行初始化。AppStorage中的属性值的更改会导致绑定的UI组件进行状态更新。
@StorageLink
@StorageLink(key)是和AppStorage中key对应的属性建立双向数据同步:
- 本地修改发生,该修改会被写回AppStorage中;
- AppStorage中的修改发生后,该修改会被同步到所有绑定AppStorage对应key的属性上,包括单向(@StorageProp和通过Prop创建的单向绑定变量)、双向(@StorageLink和通过Link创建的双向绑定变量)变量和其他实例(比如PersistentStorage)。
@Entry
@Component
struct StorageLinkPage {
@StorageLink('count') count: number = 1
build() {
Column(){
Text(`${this.count}`)
.fontSize(30)
.margin({
top:20
})
Button(){
Text(`设置值-StorageLink`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
// 设置值
AppStorage.Set<number>('count',AppStorage.Get<number>('count') + 1)
// 会同步到this.count属性
}).margin({
top:20
})
Button(){
Text(`获取值-StorageLink`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
//获取值
let number = AppStorage.Get<number>('count')
console.log(number.toString())
}).margin({
top:20
})
Button(){
Text(`改变变量Count的值`).fontSize(18).fontColor(Color.White)
}.width(200)
.height(40)
.onClick(()=>{
//count改变值会同步到 AppStorage
this.count++
}).margin({
top:20
})
}.width('100%')
.height('100%')
}
}
组件通过使用@StorageLink(key)装饰的状态变量,与AppStorage建立双向数据绑定,key为 AppStorage中的属性键值。当创建包含@StorageLink的状态变量的组件时,该状态变量的值将使用 AppStorage中的值进行初始化。在UI组件中对@StorageLink的状态变量所做的更改将同步到 AppStorage,并从AppStorage同步到任何其他绑定实例中,如PersistentStorage或其他绑定的UI组 件。