1# ArkUI子系统变更说明
2
3## cl.arkui.1@LocalStorageLink,@LocalStorageProp,@StorageProp(),@StorageLink,@Provide,@Consume,@Watch key值未定义校验
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11部分状态变量装饰器的key值在使用未定义的变量时并未被校验,不符合TS语法规则,为了匹配TS语法规则,需要对这些状态变量装饰器的key值启动语法校验。
12
13涉及的装饰器包括:
14
15@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch。
16
17**变更影响**
18
19@LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值不存在时,编译报错。
20
21该变更为非兼容性修改。
22
23**起始API Level**
24
25@LocalStorageLink:API9,
26
27@LocalStorageProp:API9,
28
29@StorageProp:API7,
30
31@StorageLink:API7,
32
33@Provide:API7,
34
35@Consume:API7,
36
37@Watch:API7。
38
39
40
41**变更发生版本**
42
43从OpenHarmony SDK 5.0.0.13开始。
44
45示例:
46
47```
48@Entry
49@Component
50struct ComA {
51  // ERROR: Cannot find name 'aaa'.
52  @StorageProp(aaa) storageProp: string = 'storageProp';
53  // ERROR: Cannot find name 'aaa'.
54  @StorageLink(aaa) storageLink: string = 'storageLink';
55  // ERROR: Cannot find name 'aaa'.
56  @LocalStorageLink(aaa) localStorageLink: string = 'localStorageLink';
57  // ERROR: Cannot find name 'aaa'.
58  @LocalStorageProp(aaa) localStorageProp: string = 'localStorageProp';
59  // ERROR: Cannot find name 'aaa'.
60  @Provide(aaa) provide: string = 'provide';
61  // ERROR: Cannot find name 'aaa'.
62  @Consume(aaa) consume: number;
63  // ERROR: Cannot find name 'aaa'.
64  @State @Watch(aaa) watch: number = 0;
65
66  build() {
67  }
68}
69
70```
71
72**适配指导**
73
74 @LocalStorageLink,@LocalStorageProp,@StorageProp,@StorageLink,@Provide,@Consume,@Watch key值需要准确定义。
75
76```
77// test.ts
78export let oneKey = 'string';
79```
80
81
82
83```
84
85// index.ets
86import { oneKey } from './test';
87@Entry
88@Component
89struct ComA {
90  @StorageProp(oneKey) storageProp: string = 'storageProp';
91  @StorageLink(oneKey) storageLink: string = 'storageLink';
92  @LocalStorageLink(oneKey) localStorageLink: string = 'localStorageLink';
93  @LocalStorageProp(oneKey) localStorageProp: string = 'localStorageProp';
94  @Provide(oneKey) provide: string = 'provide';
95  @Consume(oneKey) consume: number;
96
97  build() {
98  }
99}
100```
101
102
103
104
105## cl.arkui.2 AppStorage,LocalStorage,PersistentStorage支持undefined和null
106
107**访问级别**
108
109公开接口
110
111**变更影响**
112
113AppStorage,LocalStorage,PersistentStorage的API方法支持null和undefined作为入参。@StorageLink,@StorageProp,@LocalStorageLink,@LocalStorageProp装饰器支持null和undefined类型。
114
115以@StorageLink为例,当前应用存在误用null和undefined作为初始值或目标值在AppStorage中保存的情况。在更改前的语义中,null和undefined作为初始值或目标值的调用并不会生效,并给出warning。在更改后的语义中,支持了使用null和undefined作为初始值或目标值在AppStorage中保存。该更改使得以下场景中,原有应用代码运行崩溃。
116
117更改前
118
119```ts
120class PropA {
121  num: number = 100;
122}
123
124AppStorage.setOrCreate("PropA", null);
125AppStorage.has("PropA");// 不支持设置null或undefined,会返回false
126
127@Entry
128@Component
129struct TestPage {
130  @StorageLink('PropA') propA: PropA = new PropA();
131
132  build() {
133    Column() {
134      Text(this.propA.num.toString()) //使用propA本地初始化的值为100
135    }
136  }
137}
138```
139
140更改后
141
142```ts
143class PropA {
144  num: number = 100;
145}
146
147AppStorage.setOrCreate("PropA", null);
148AppStorage.has("PropA");// 支持设置null或undefined,会返回true
149
150@Entry
151@Component
152struct TestPage {
153  @StorageLink('PropA') propA: PropA = new PropA();
154
155  build() {
156    Column() {
157      Text(this.propA.num.toString()) //使用AppStorage初始化的值 ‘null’ ,调用时触发JsCrash
158    }
159  }
160}
161```
162
163**变更涉及接口**
164
165AppStorage:set,setOrCreate,setAndLink,setAndProp
166
167LocalStorage:set,setOrCreate,setAndLink,setAndProp
168
169PersistentStorage:persistProp
170
171
172**起始API Level**
173
174该变更从API12开始生效,API11及之前不受影响。
175
176AppStorage
177
178set:API10,
179
180setOrCreate:API10,
181
182setAndLink:API10,
183
184setAndProp:API10
185
186LocalStorage
187
188set:API9,
189
190setOrCreate:API9,
191
192setAndLink:API9,
193
194setAndProp:API9
195
196PersistentStorage
197
198persistProp:API10
199
200**变更发生版本**
201
202从OpenHarmony SDK 5.0.0.13开始。
203
204**适配指导**
205
2061、在初始化值的时候不使用null或者undefined的值来初始化,使用有意义的值来初始化。
207
2082、将原有的值改为null或undefined会触发UI刷新。
209
2103、在调用的地方增加判空。
211
212```ts
213class PropA {
214  num: number = 100;
215}
216
217AppStorage.setOrCreate("PropA", null);
218AppStorage.has("PropA"); // 支持设置null或undefined,会返回true
219
220@Entry
221@Component
222struct TestPage {
223  @StorageLink('PropA') propA: PropA | null | undefined = new PropA();
224
225  build() {
226    Column() {
227      Text(this.propA?.num.toString())//使用时进行判空,防止调用时为null和undefined的情况造成crash。
228        .fontSize(20)
229      Button("Set propA to null")
230        .margin(10)
231        .onClick(() => {
232          this.propA = null;
233        })
234      Button("Set propA to undefined")
235        .margin(10)
236        .onClick(() => {
237          this.propA = undefined;
238        })
239      Button("Assign new PropA")
240        .margin(10)
241        .onClick(() => {
242          this.propA = new PropA();
243        })
244    }
245  }
246}
247```