HarmonyOS NEXT开发笔记:AppStorageV2-应用全局UI状态存储

鸿蒙开发往期必看:

一分钟了解”纯血版!鸿蒙HarmonyOS Next应用开发!

“非常详细的” 鸿蒙HarmonyOS Next应用开发学习路线!(从零基础入门到精通)

 “一杯冰美式的时间” 了解鸿蒙HarmonyOS Next应用开发路径!


为了增强状态管理框架对应用全局UI状态变量存储的能力,开发者可以使用AppStorageV2存储应用全局UI状态变量数据。

说明

AppStorageV2从API version 12开始支持。

当前状态管理(V2试用版)仍在逐步开发中,相关功能尚未成熟,建议开发者尝鲜试用。

概述

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

AppStorageV2可以和UI组件同步,且可以在应用业务逻辑中被访问。

AppStorageV2支持应用的主线程内多个UIAbility实例间的状态共享。

使用说明

connect:创建或获取储存的数据

static connect<T extends object>(
    type: TypeConstructorWithArgs<T>,
    keyOrDefaultCreator?: string | StorageDefaultCreator<T>,
    defaultCreator?: StorageDefaultCreator<T> 
): T | undefined;
connect说明
参数

type:指定的类型,若未指定key,则使用type的name作为key;

keyOrDefaultCreater:指定的key,或者是默认数据的构造器;

defaultCreator:默认数据的构造器。

返回值创建或获取数据成功时,返回数据;否则返回undefined。

说明

1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器);

2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;

3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配;

4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的;

5、关联@Observed对象时,由于该类型的name属性未定义,需要指定key或者自定义name属性。

remove:删除指定key的储存数据

static remove<T>(keyOrType: string | TypeConstructorWithArgs<T>): void;
remove说明
参数keyOrType:需要删除的key;如果指定的是type类型,删除的key为type的name。
返回值无。

说明

删除AppStorageV2中不存在的key会报警告。

keys:返回所有AppStorageV2中的key

static keys(): Array<string>;
keys说明
参数无。
返回值所有AppStorageV2中的key。

使用限制

1、需要配合UI使用(UI线程),不能在其他线程使用,如不支持@Sendable;

2、不支持collections.Set、collections.Map等类型;

3、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。

使用场景

在两个页面之间存储数据

页面1

import { router, AppStorageV2 } from '@kit.ArkUI';
import { Sample } from '../Sample';

@Entry
@ComponentV2
struct Page1 {
  // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
  @Local prop: Sample = AppStorageV2.connect(Sample, () => new Sample())!;

  build() {
    Column() {
      Button('Go to page2')
        .onClick(() => {
          router.pushUrl({
            url: 'pages/Page2'
          })
        })

      Button('Page1 connect the key Sample')
        .onClick(() => {
          // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
          this.prop = AppStorageV2.connect(Sample, 'Sample', () => new Sample())!;
        })

      Button('Page1 remove the key Sample')
        .onClick(() => {
          // 从AppStorageV2中删除后,prop将不会再与key为Sample的值关联
          AppStorageV2.remove(Sample);
        })

      Text(`Page1 add 1 to prop.p1: ${this.prop.p1}`)
        .fontSize(30)
        .onClick(() => {
          this.prop.p1++;
        })

      Text(`Page1 add 1 to prop.p2: ${this.prop.p2}`)
        .fontSize(30)
        .onClick(() => {
          // 页面不刷新,但是p2的值改变了
          this.prop.p2++;
        })

      // 获取当前AppStorageV2里面的所有key
      Text(`all keys in AppStorage: ${AppStorageV2.keys()}`)
        .fontSize(30)
    }
  }
}

页面2

import { AppStorageV2 } from '@kit.ArkUI';
import { Sample } from '../Sample';

@Entry
@ComponentV2
struct Page2 {
  // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
  @Local prop: Sample = AppStorageV2.connect(Sample, () => new Sample())!;

  build() {
    Column() {
      Button('Page2 connect the key Sample1')
        .onClick(() => {
          // 在AppStorageV2中创建一个key为Sample1的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
          this.prop = AppStorageV2.connect(Sample, 'Sample1', () => new Sample())!;
        })

      Text(`Page2 add 1 to prop.p1: ${this.prop.p1}`)
        .fontSize(30)
        .onClick(() => {
          this.prop.p1++;
        })

      Text(`Page2 add 1 to prop.p2: ${this.prop.p2}`)
        .fontSize(30)
        .onClick(() => {
          // 页面不刷新,但是p2的值改变了;只有重新初始化才会改变
          this.prop.p2++;
        })

      // 获取当前AppStorageV2里面的所有key
      Text(`all keys in AppStorage: ${AppStorageV2.keys()}`)
        .fontSize(30)
    }
  }
}

数据页面

// 数据中心
@ObservedV2
export class Sample {
  @Trace p1: number = 0;
  p2: number = 10;
}

最后

小编在之前的鸿蒙系统扫盲中,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

如果你是一名有经验的资深Android移动开发、Java开发、前端开发、对鸿蒙感兴趣以及转行人员

GitCode - 全球开发者的开源社区,开源代码托管平台 希望这一份鸿蒙学习文档能够给大家带来帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值