1# ArkUI子系统变更说明
2
3## cl.arkui.1 @Require装饰器增加对@State/@Provide/普通变量(无状态装饰器修饰的变量)校验的变更
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11开发者提出,当使用@Require修饰@State/@Provide/常规成员变量时,需要进行构造赋值校验。
12
13**变更影响**
14
15变更前:@Require支持校验的装饰器有@Prop和@BuilderParam。
16
17变更后:@Require支持校验的装饰器有@Prop、@BuilderParam、@State、@Provide和普通变量(无状态装饰器修饰的变量)。
18
19错误示例如下:
20
21```ts
22@Entry
23@Component
24struct Index {
25  @State message: string = 'Hello World';
26
27  @Builder buildTest() {
28    Row() {
29      Text('Hello, world')
30        .fontSize(30)
31    }
32  }
33
34  build() {
35    Row() {
36      Child()
37    }
38  }
39}
40
41@Component
42struct Child {
43  @Builder buildFuction() {
44    Column() {
45      Text('initBuilderParam')
46        .fontSize(30)
47    }
48  }
49  // 使用@Require必须构造时传参。
50  @Require regular_value: string = 'Hello';
51  @Require @State state_value: string = "Hello";
52  @Require @Provide provide_value: string = "Hello";
53  @Require @BuilderParam initbuildTest: () => void = this.buildFuction;
54  @Require @Prop initMessage: string = 'Hello';
55
56  build() {
57    Column() {
58      Text(this.initMessage)
59        .fontSize(30)
60      this.initbuildTest();
61    }
62  }
63}
64```
65
66正确示例如下:
67```ts
68@Entry
69@Component
70struct Index {
71  @State message: string = 'Hello World';
72
73  @Builder buildTest() {
74    Row() {
75      Text('Hello, world')
76        .fontSize(30)
77    }
78  }
79
80  build() {
81    Row() {
82      Child({ regular_value: this.message, state_value: this.message, provide_value: this.message, initMessage: this.message, message: this.message,
83        buildTest: this.buildTest, initbuildTest: this.buildTest })
84    }
85  }
86}
87
88@Component
89struct Child {
90  @Builder buildFuction() {
91    Column() {
92      Text('initBuilderParam')
93        .fontSize(30)
94    }
95  }
96  @Require regular_value: string = 'Hello';
97  @Require @State state_value: string = "Hello";
98  @Require @Provide provide_value: string = "Hello";
99  @Require @BuilderParam buildTest: () => void;
100  @Require @BuilderParam initbuildTest: () => void = this.buildFuction;
101  @Require @Prop initMessage: string = 'Hello';
102  @Require @Prop message: string;
103
104  build() {
105    Column() {
106      Text(this.initMessage)
107        .fontSize(30)
108      Text(this.message)
109        .fontSize(30)
110      this.initbuildTest();
111      this.buildTest();
112    }
113    .width('100%')
114    .height('100%')
115  }
116}
117```
118
119**起始API Level**
120
121起始支持版本为 API 12。
122
123**变更发生版本**
124
125从OpenHarmony SDK 5.0.0.12开始。
126
127**适配指导**
128
129开发者需要根据告警提示信息,对@Require变量的赋值进行适配整改。
130
131**参考文档**
132
133[@Require装饰器:校验构造传参](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/arkts-require.md)
134
135
136## cl.arkui.2 编译转换增加对自定义组件成员属性访问限定符的使用限制
137
138**访问级别**
139
140公开接口
141
142**增加原因**
143
144开发者提出,当不按规范使用访问限定符private/public/protected时,需要进行编译校验。
145
146**增加影响**
147
148控制台输出告警日志信息。
149
150错误使用示例如下:
151
1521.当成员变量被private访问限定符和@State/@Prop/@Provide/@BuilderParam装饰器同时修饰时,使用父组件AccessRestrictions调用自定义组件ComponentsChild,对自定义组件ComponentsChild进行构造赋值,因为自定义组件ComponentsChild的private是私有的不支持外部构造赋值,所以ArkTS会进行校验并产生告警日志。
153
154```ts
155@Entry
156@Component
157struct AccessRestrictions {
158  @Builder buildTest() {
159    Text("Parent builder")
160  }
161  build() {
162    Column() {
163      ComponentsChild({state_value: "Hello", prop_value: "Hello", provide_value: "Hello", builder_value: this.buildTest, regular_value: "Hello"})
164    }
165    .width('100%')
166  }
167}
168
169@Component
170struct ComponentsChild {
171  @State private state_value: string = "Hello";
172  @Prop private prop_value: string = "Hello";
173  @Provide private provide_value: string = "Hello";
174  @BuilderParam private builder_value: () => void = this.buildTest;
175  private regular_value: string = "Hello";
176  @Builder buildTest() {
177    Text("Child builder")
178  }
179  build() {
180    Column() {
181      Text("Hello")
182        .fontSize(50)
183        .fontWeight(FontWeight.Bold)
184    }
185  }
186}
187```
188
1892.当成员变量被public访问限定符和@StorageLink/@StorageProp/@LocalStorageLink/@Consume装饰器同时修饰时,因为@StorageLink/@StorageProp/@LocalStorageLink/@Consume装饰器只支持被私有成员变量改变,所以ArkTS会进行校验并产生告警日志。
190
191```ts
192@Entry
193@Component
194struct AccessRestrictions {
195  build() {
196    Column() {
197      ComponentChild()
198    }
199    .width('100%')
200  }
201}
202
203@Component
204struct ComponentChild {
205  @LocalStorageProp("sessionLocalProp") public local_prop_value: string = "Hello";
206  @LocalStorageLink("sessionLocalLink") public local_link_value: string = "Hello";
207  @StorageProp("sessionProp") public storage_prop_value: string = "Hello";
208  @StorageLink("sessionLink") public storage_link_value: string = "Hello";
209  @Consume public consume_value: string;
210  build() {
211    Column() {
212      Text("Hello")
213        .fontSize(50)
214        .fontWeight(FontWeight.Bold)
215    }
216  }
217}
218```
219
2203.当成员变量被private访问限定符和@Link/@ObjectLink装饰器同时修饰时,因为@Link/@ObjectLink装饰器只支持从父组件进行初始化,所以ArkTS会进行校验并产生告警日志。
221
222```ts
223@Entry
224@Component
225struct AccessRestrictions {
226  build() {
227    Column() {
228      ComponentChild({link_value: "Hello", objectLink_value: new ComponentObj()})
229    }
230    .width('100%')
231  }
232}
233
234@Observed
235class ComponentObj {
236  count: number = 0;
237}
238@Component
239struct ComponentChild {
240  @Link private link_value: string;
241  @ObjectLink private objectLink_value: ComponentObj;
242  build() {
243    Column() {
244      Text("Hello")
245        .fontSize(50)
246        .fontWeight(FontWeight.Bold)
247    }
248  }
249}
250```
251
2524.当成员变量被protected访问限定符修饰时,因为自定义组件struct不支持继承,所以自定义组件的成员变量不支持被protected修饰,ArkTS会进行校验并产生告警日志。
253
254```ts
255@Entry
256@Component
257struct AccessRestrictions {
258  build() {
259    Column() {
260      ComponentChild({regular_value: "Hello"})
261    }
262    .width('100%')
263  }
264}
265
266@Component
267struct ComponentChild {
268  protected regular_value: string = "Hello";
269  build() {
270    Column() {
271      Text("Hello")
272        .fontSize(50)
273        .fontWeight(FontWeight.Bold)
274    }
275  }
276}
277```
278
2795.因为private是私有的不支持外部构造赋值,@Require装饰器修饰变量又必须要求构造赋值,这两者冲突,所以当成员变量被private访问限定符、@Require和@State/@Prop/@Provide/@BuilderParam装饰器同时修饰时,ArkTS会进行校验并产生告警日志。
280
281```ts
282@Entry
283@Component
284struct AccessRestrictions {
285  build() {
286    Column() {
287      ComponentChild({prop_value: "Hello"})
288    }
289    .width('100%')
290  }
291}
292@Component
293struct ComponentChild {
294  @Require @Prop private prop_value: string = "Hello";
295  build() {
296    Column() {
297      Text("Hello")
298        .fontSize(50)
299        .fontWeight(FontWeight.Bold)
300    }
301  }
302}
303```
304
305**API Level**
306
307起始支持版本为 API 12。
308
309**增加发生版本**
310
311从OpenHarmony SDK 5.0.0.12开始。
312
313**适配指导**
314
315开发者需要根据告警提示信息,对使用访问限定符的位置进行适配整改。
316
317**参考文档**
318
319[自定义组件成员属性访问限定符使用限制](https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/quick-start/arkts-custom-components-access-restrictions.md)
320
321
3226.由于AnimatorResult 中的onframe,onfinish,oncancel,onrepeat方法不符合语法规范,所以新增接口 onFrame,onFinish,onCancel,onRepeat。
323
324**API Level**
325
326起始支持版本为 API 12。
327
328**增加发生版本**
329
330从OpenHarmony SDK 5.0.0.12开始。
331
332**适配指导**
333
334开发者如果继承AnimatorResult接口。则需要新增nFrame,onFinish,onCancel,onRepeat方法的实现。
335
336**参考文档**
337
338[animator动画](../../../application-dev/reference/apis-arkui/js-apis-animator.md)