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.Set、collections.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