Skip to content

AppStorage

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

分类

@StorageProp

不会同步

会同步

观察

  • 只能观察到第一层的

限制条件

WARNING

  1. @StorageProp/@StorageLink 的属性必须为 string 类型 @StorageLink('xxxx')

  2. @StorageProp 与@StorageLink 不支持装饰 Function 类型的变量,框架会抛出运行时错误

  3. 除非配合 PersistentStorage 否则推出程序后数据会丢失

简易 demo

无需声明,直接使用即可

ts
AppStorage.setOrCreate("name", "张三");
AppStorage.setOrCreate("age", 56);
struct Person {
  // 然后使用
  @StroageProps("name") name:string = "";
  @StroageLink("age") age:number = 56;
}

完整使用

ts
import {router} from "@kit.ArkUI"
// 放到任意的位置都可以
AppStorage.setOrCreate("name","张三")
AppStorage.setOrCreate("age",36)

@Entry
@Component
struct Index {
    @StorageLink("name") name:string = "";
    @StorageLink("age") age:number = 23;
    build() {
     Column({space:20}){
         Row(){
             Text(this.age.toString()).fontSize(48).fontColor(Color.Green)
             Text(this.name).fontSize(48).fontColor(Color.Green)
         }
         Row(){
             Button("点击改变年龄").onClick(()=>{
                 this.age +=1;
             })

             Button("点击改变年龄").onClick(()=>{
                 this.name = "名字改变了";
             })
         }
         Row(){
             Button("点击跳转").onClick(()=>{
                  router.pushUrl({
                      url:'pages/Index2'
                  })
             })
         }
     }
    }
}

应用持久化

PersistentStorage

PersistentStorage 虽然名字和 AppStorage、LocalStorage 很像,但实际上他不负责存储相关的操作。它的作用其实是声明、或者标记。

通过 persistProp 声明一个键值对,然后 AppStorage 存储的该数据就变成了持久化存储了。

这样关闭应用,数据也能保留

注意

  1. 因为是声明,所以一次就好了,不需要多次声明。 建议在 app 启动后就声明

  2. 因为是AppStorage中该数据变成持久化存储,所以针对该数据的操作都通过AppStorage来进行操作。

  3. 声明一定要在 AppStorage 使用之前!重点,这是个坑。

语法举例

ts
    //声明了属性aProp,并设置默认值。(该默认值,是未存储过的时候才使用的默认值)
    PersistentStorage.persistProp('aProp', 47);
    // 获取持久化值
    AppStorage.get('aProp')
    // 使用
    AppStorage.setOrCreate('aProp'36

取消持久化

ts
PersistentStorage.deleteProp("xxxx");

举例

ts
import {router} from "@kit.ArkUI"
PersistentStorage.persistProp('name', "张三");
PersistentStorage.persistProp('age', 36);

@Entry
@Component
struct Index {
    @StorageLink("name") name:string = "";
    @StorageLink("age") age:number = 23;
    build() {
     Column({space:20}){
         Row(){
             Text(this.age.toString()).fontSize(48).fontColor(Color.Green)
             Text(this.name).fontSize(48).fontColor(Color.Green)
         }
         Row(){
             Button("点击改变年龄").onClick(()=>{
                 this.age +=1;
             })

             Button("点击改变年龄").onClick(()=>{
                 this.name = "名字改变了";
             })
         }
         Row(){
             Button("点击跳转").onClick(()=>{
                  router.pushUrl({
                      url:'pages/Index2'
                  })
             })
         }
     }
    }
}

查看位置

  • 查看缓存存到什么位置