• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# AppStorageV2: 应用全局UI状态存储
2
3为了增强状态管理框架对应用全局UI状态变量存储的能力,开发者可以使用AppStorageV2存储应用全局UI状态变量数据。
4
5>**说明:**
6>
7>AppStorageV2从API version 12开始支持。
8>
9>当前状态管理(V2试用版)仍在逐步开发中,相关功能尚未成熟,建议开发者尝鲜试用。
10
11
12## 概述
13
14AppStorageV2是在应用UI启动时会被创建的单例。它的目的是为了提供应用状态数据的中心存储,这些状态数据在应用级别都是可访问的。AppStorageV2将在应用运行过程保留其数据。数据通过唯一的键字符串值访问。
15
16AppStorageV2可以和UI组件同步,且可以在应用业务逻辑中被访问。
17
18AppStorageV2支持应用的[主线程](../application-models/thread-model-stage.md)内多个UIAbility实例间的状态共享。
19
20
21## 使用说明
22
23### connect:创建或获取储存的数据
24
25```JavaScript
26static connect<T extends object>(
27    type: TypeConstructorWithArgs<T>,
28    keyOrDefaultCreator?: string | StorageDefaultCreator<T>,
29    defaultCreator?: StorageDefaultCreator<T>
30): T | undefined;
31```
32
33| connect      | 说明                                                  |
34| ------------ | ----------------------------------------------------- |
35| 参数         | type:指定的类型,若未指定key,则使用type的name作为key;</br > keyOrDefaultCreater:指定的key,或者是默认数据的构造器;</br > defaultCreator:默认数据的构造器。                                          |
36| 返回值       | 创建或获取数据成功时,返回数据;否则返回undefined。 |
37
38>**说明:**
39>
40>1、若未指定key,使用第二个参数作为默认构造器;否则使用第三个参数作为默认构造器(第二个参数非法也使用第三个参数作为默认构造器);
41>
42>2、确保数据已经存储在AppStorageV2中,可省略默认构造器,获取存储的数据;否则必须指定默认构造器,不指定将导致应用异常;
43>
44>3、同一个key,connect不同类型的数据会导致应用异常,应用需要确保类型匹配;
45>
46>4、key建议使用有意义的值,可由字母、数字、下划线组成,长度不超过255,使用非法字符或空字符的行为是未定义的;
47>
48>5、关联[\@Observed](arkts-observed-and-objectlink.md)对象时,由于该类型的name属性未定义,需要指定key或者自定义name属性。
49
50### remove:删除指定key的储存数据
51
52```JavaScript
53static remove<T>(keyOrType: string | TypeConstructorWithArgs<T>): void;
54```
55
56| remove       | 说明                                                  |
57| ------------ | ----------------------------------------------------- |
58| 参数         | keyOrType:需要删除的key;如果指定的是type类型,删除的key为type的name。                                          |
59| 返回值       | 无。 |
60
61>**说明:**
62>
63>删除AppStorageV2中不存在的key会报警告。
64
65### keys:返回所有AppStorageV2中的key
66
67```JavaScript
68static keys(): Array<string>;
69```
70
71| keys         | 说明                                                  |
72| ------------ | ----------------------------------------------------- |
73| 参数         | 无。                                         |
74| 返回值       | 所有AppStorageV2中的key。 |
75
76
77## 使用限制
78
791、需要配合UI使用(UI线程),不能在其他线程使用,如不支持@Sendable;
80
812、不支持collections.Setcollections.Map等类型;
82
833、不支持非buildin类型,如PixelMap、NativePointer、ArrayList等Native类型。
84
85## 使用场景
86
87### 在两个页面之间存储数据
88
89页面1
90```ts
91import { router, AppStorageV2 } from '@kit.ArkUI';
92import { Sample } from '../Sample';
93
94@Entry
95@ComponentV2
96struct Page1 {
97  // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
98  @Local prop: Sample = AppStorageV2.connect(Sample, () => new Sample())!;
99
100  build() {
101    Column() {
102      Button('Go to page2')
103        .onClick(() => {
104          router.pushUrl({
105            url: 'pages/Page2'
106          })
107        })
108
109      Button('Page1 connect the key Sample')
110        .onClick(() => {
111          // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
112          this.prop = AppStorageV2.connect(Sample, 'Sample', () => new Sample())!;
113        })
114
115      Button('Page1 remove the key Sample')
116        .onClick(() => {
117          // 从AppStorageV2中删除后,prop将不会再与key为Sample的值关联
118          AppStorageV2.remove(Sample);
119        })
120
121      Text(`Page1 add 1 to prop.p1: ${this.prop.p1}`)
122        .fontSize(30)
123        .onClick(() => {
124          this.prop.p1++;
125        })
126
127      Text(`Page1 add 1 to prop.p2: ${this.prop.p2}`)
128        .fontSize(30)
129        .onClick(() => {
130          // 页面不刷新,但是p2的值改变了
131          this.prop.p2++;
132        })
133
134      // 获取当前AppStorageV2里面的所有key
135      Text(`all keys in AppStorage: ${AppStorageV2.keys()}`)
136        .fontSize(30)
137    }
138  }
139}
140```
141
142页面2
143```ts
144import { AppStorageV2 } from '@kit.ArkUI';
145import { Sample } from '../Sample';
146
147@Entry
148@ComponentV2
149struct Page2 {
150  // 在AppStorageV2中创建一个key为Sample的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
151  @Local prop: Sample = AppStorageV2.connect(Sample, () => new Sample())!;
152
153  build() {
154    Column() {
155      Button('Page2 connect the key Sample1')
156        .onClick(() => {
157          // 在AppStorageV2中创建一个key为Sample1的键值对(如果存在,则返回AppStorageV2中的数据),并且和prop关联
158          this.prop = AppStorageV2.connect(Sample, 'Sample1', () => new Sample())!;
159        })
160
161      Text(`Page2 add 1 to prop.p1: ${this.prop.p1}`)
162        .fontSize(30)
163        .onClick(() => {
164          this.prop.p1++;
165        })
166
167      Text(`Page2 add 1 to prop.p2: ${this.prop.p2}`)
168        .fontSize(30)
169        .onClick(() => {
170          // 页面不刷新,但是p2的值改变了;只有重新初始化才会改变
171          this.prop.p2++;
172        })
173
174      // 获取当前AppStorageV2里面的所有key
175      Text(`all keys in AppStorage: ${AppStorageV2.keys()}`)
176        .fontSize(30)
177    }
178  }
179}
180```
181
182数据页面
183```ts
184// 数据中心
185@ObservedV2
186export class Sample {
187  @Trace p1: number = 0;
188  p2: number = 10;
189}
190```
191