• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI子系统Changelog
2
3## cl.arkui.1 当使用自定义组件名和内置属性重名时编译报错变更
4
5**访问级别**
6
7公开接口
8
9**变更原因**
10
11当使用自定义组件名和内置属性重名时,编译会根据指定的白名单进行拦截报错,如果白名单中不存在,编译就拦截不到,导致编译转换后的产物出现问题。
12
13**变更影响**
14
15该变更涉及应用适配。
16
17举例说明,执行以下用例:
18
19```ts
20@Entry
21@Component
22struct enableAnalyzer {
23  build() {
24    Canvas()
25      .enableAnalyzer((true))
26  }
27}
28```
29
30变更前:
31不在白名单的内置组件属性与自定义组件重名时,编译没有拦截报错,导致运行时crash。
32
33变更后:
34在白名单的内置组件属性与自定义组件重名时,编译拦截报错。
35
36![arkui_pg1](figures/arkui_pg1.PNG)
37
38**起始API Level**
39
40API 10
41
42**变更发生版本**
43
44从OpenHarmony SDK 5.1.0.44开始。
45
46**变更的接口/组件**
47
48ArkUI 内置组件属性API。
49
50**适配指导**
51
52自定义组件名和内置组件属性重名时,编译报错,修改自定义组件名为其他非内置组件属性名即可解决。
53
54修改前:
55
56自定义组件enableAnalyzer和Canvas的enableAnalyzer重名。
57
58```ts
59@Entry
60@Component
61struct enableAnalyzer {
62  build() {
63    Canvas()
64      .enableAnalyzer()
65  }
66}
67```
68
69修改后:
70
71将自定义组件名改为任意不和内置组件重名的名称,如EnableAnalyzerComp。
72
73```ts
74@Entry
75@Component
76struct EnableAnalyzerComp {
77  build() {
78    Canvas()
79      .enableAnalyzer()
80  }
81}
82```
83
84## cl.arkui.2 @ComponentV2自定义组件冻结变更
85
86**访问级别**
87
88公开接口
89
90**变更原因**
91
92当@ComponentV2装饰的子组件设置freezeWhenInactive为true时,父组件没有设置,则子组件的组件冻结功能不生效。
93
94为了确保组件冻结功能生效,需要修改当子组件设置freezeWhenInactive为true,无论父组件是否设置,子组件的组件冻结功能应生效。
95
96**变更影响**
97
98该变更为不兼容变更。
99
100变更前:仅子组件开启了组件冻结,父组件没有开启组件冻结,不会对子组件开启冻结功能。
101
102变更后:仅子组件开启了组件冻结,父组件没有开启组件冻结,子组件会启用组件冻结功能。
103
104**起始API Level**
105
106API 12
107
108**变更发生版本**
109
110从OpenHarmony SDK 5.1.0.44开始。
111
112**变更的接口/组件**
113
114@ComponentV2的freezeWhenInactive接口。
115
116**适配指导**
117
118当子组件使用了组件冻结,父组件没有使用组件冻结的情况下,当组件处于inactive时,子组件组件冻结功能生效。示例如下:
119
120页面1:
121
122```ts
123// Page1.ets
124import { router } from '@kit.ArkUI';
125
126@ObservedV2
127export class Book {
128  @Trace name: string = "100";
129
130  constructor(page: string) {
131    this.name = page;
132  }
133}
134
135@Entry
136@ComponentV2
137export struct Page1 {
138  build() {
139    Column() {
140      Child()
141    }
142  }
143}
144
145@ComponentV2({ freezeWhenInactive: true })
146export struct Child {
147  @Local bookTest: Book = new Book("A Midsummer Night’s Dream");
148
149  @Monitor("bookTest.name")
150  onMessageChange(monitor: IMonitor) {
151    console.log(`The book name change from ${monitor.value()?.before} to ${monitor.value()?.now}`);
152  }
153
154  textUpdate(): number{
155    console.log("The text is update");
156    return 25;
157  }
158
159  build() {
160    Column() {
161      Text(`The book name is  ${this.bookTest.name}`).fontSize(this.textUpdate())
162      Button('go to next page').fontSize(30)
163        .onClick(() => {
164          router.pushUrl({ url: 'pages/Page2' });
165          setTimeout(() => {
166            this.bookTest = new Book("Jane Austen oPride and Prejudice");
167          }, 1000);
168        })
169    }
170  }
171}
172```
173
174页面2:
175
176```ts
177// Page2.ets
178import { router } from '@kit.ArkUI';
179
180@Entry
181@ComponentV2
182struct Page2 {
183  build() {
184    Column() {
185      Text(`This is the page`).fontSize(50)
186      Button('Back')
187        .onClick(() => {
188          router.back();
189        })
190    }
191  }
192}
193```
194
195如果开发者不关注组件冻结的功能是否生效,只是调用了其接口,会发现组件冻结能力在该场景下并没有生效,即在跳转到页面2后,改变状态变量`@Local bookTest`,页面1的Child组件还会刷新,其@Monitor也会调用。
196
197trace如下:
198![Example Image](../../figures/freeze2.png)
199
200变更后,修复了上面示例中组件冻结接口不生效的行为,变更后的行为是:
201- 页面1的子组件Child,设置`freezeWhenInactive: true`, 开启了组件冻结功能。
202- 点击Button跳转到页面2,然后延迟1s更新状态变量`bookTest`。在更新`bookTest`的时候,已经跳转到页面2,页面1的组件处于inactive状态,又因为Child组件开启了组件冻结,状态变量`@Local bookTest`将不响应更新,其@Monitor不会调用,状态变量关联的节点不会刷新。
203
204变更后trace如下:
205![Example Image](../../figures/freeze1.png)
206
207如果开发者希望Page1在不可见的时候依旧刷新,和正常触发@Monitor回调,建议不使用组件冻结功能,即不设置`freezeWhenInactive: true`。示例如下:
208
209
210页面1:
211
212```ts
213// Page1.ets
214import { router } from '@kit.ArkUI';
215
216@ObservedV2
217export class Book {
218  @Trace name: string = "100";
219
220  constructor(page: string) {
221    this.name = page;
222  }
223}
224
225@Entry
226@ComponentV2
227export struct Page1 {
228  build() {
229    Column() {
230      Child()
231    }
232  }
233}
234
235@ComponentV2
236export struct Child {
237  @Local bookTest: Book = new Book("A Midsummer Night’s Dream");
238
239  @Monitor("bookTest.name")
240  onMessageChange(monitor: IMonitor) {
241    console.log(`The book name change from ${monitor.value()?.before} to ${monitor.value()?.now}`);
242  }
243
244  textUpdate(): number{
245    console.log("The text is update");
246    return 25;
247  }
248
249  build() {
250    Column() {
251      Text(`The book name is  ${this.bookTest.name}`).fontSize(this.textUpdate())
252      Button('go to next page').fontSize(30)
253        .onClick(() => {
254          router.pushUrl({ url: 'pages/Page2' });
255          setTimeout(() => {
256            this.bookTest = new Book("Jane Austen oPride and Prejudice");
257          }, 1000);
258        })
259    }
260  }
261}
262```
263
264页面2:
265
266```ts
267// Page2.ets
268import { router } from '@kit.ArkUI';
269
270@Entry
271@ComponentV2
272struct Page2 {
273  build() {
274    Column() {
275      Text(`This is the page`).fontSize(50)
276      Button('Back')
277        .onClick(() => {
278          router.back();
279        })
280    }
281  }
282}
283```
284
285当子组件Child不使用组件冻结功能时,跳转到页面2,修改状态变量将响应更新,@Monitor被调用,状态变量关联的节点将会刷新。
286
287## cl.arkui.3 contentModifier导致margin属性失效变更
288
289**访问级别**
290
291公开接口
292
293**变更原因**
294
295用户配置了contentModifier时,设置margin无法生效。
296
297**变更影响**
298
299此变更需要应用适配。
300
301| 变更前 | 变更后 |
302|---------|---------|
303|配置了contentModifier时,设置margin不生效|配置了contentModifier时,设置margin生效|
304|![超长错误文本变更前样式](figures/ContentModifierBefore.png)|![超长错误文本变更后样式](figures/ContentModifierAfter.png)|
305
306**起始API Level**
307
308API 12
309
310**变更发生版本**
311
312从OpenHarmony SDK 5.1.0.44开始。
313
314**变更的接口/组件**
315
316Checkbox/Radio/Rating/Slider/Toggle/DataPanel/Gauge/LoadingProgress/Progress
317
318**适配指导**
319
320若应用存在使用contentModifer,并且设置了margin的情况,变更后margin会生效,适配删除margin属性即可。
321
322```ts
323@Entry
324@Component
325struct Index {
326
327  build() {
328    Column() {
329      Text("Checkbox设置了margin top为200")
330      Checkbox({ name: '复选框状态', group: 'checkboxGroup' })
331        .contentModifier(new MyCheckboxStyle(Color.Red))
332        .onChange((value: boolean) => {
333          console.info('Checkbox change is' + value)
334        })
335        // .margin({ top: 200 }) 若期望原有效果,删除margin调用即可
336    }.width('100%')
337  }
338}
339```
340
341## cl.arkui.4 textClock的format处理12/24小时制逻辑修改
342
343**访问级别**
344
345公开接口
346
347**变更原因**
348
349在将textClock的format动态修改为HH(24小时制)之后,再切换回hh(12小时制),12小时制未能正确生效。
350
351**变更影响**
352
353此变更涉及应用适配。
354
355变更前:
356
3571. 在将textClock的format设置动态修改为'HH'后,时间显示为24小时制。再修改format为'hh'后,时间显示依然为24小时制,而预期应切换至12小时制显示。
358
3592. 在将textClock的format设置为'hh'后,若系统设置开启24小时制,时间显示将调整为24小时制。当系统设置关闭24小时制时,时间显示则会切换至12小时制。
360
361变更后:
362
3631. 在将textClock的format设置动态修改为'HH'后,时间显示为24小时制。再修改format为'hh'后,时间显示为12小时制。
364
3652. 在将textClock的format设置为'hh'后,若系统设置开启24小时制,时间显示为12小时制。当系统设置关闭24小时制时,时间显示依旧为12小时制。
366
367**起始API Level**
368
369API 8
370
371**变更发生版本**
372
373从OpenHarmony SDK 5.1.0.44开始
374
375**变更的接口/组件**
376
377textClock组件的format
378
379**适配指导**
380
381如果开发者原本使用hh来适应系统12/24小时制的特性,使得应用的时间格式能够根据系统设置变化。可以使用i18n.System.is24HourClock()来判断系统的设置,从而相应地调整format设置。
382```ts
383import { i18n } from '@kit.LocalizationKit';
384
385@Entry
386@Component
387struct textClock {
388  // 使用i18n.System.is24HourClock()来获取系统是否使用24小时制
389  @State formatString: string = i18n.System.is24HourClock() ? "HH:mm:ss" : "aa hh:mm"
390
391  build() {
392    Column(){
393      TextClock()
394        .format(this.formatString)
395    }
396  }
397}
398```