• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI变更说明
2
3## cl.arkui.1 状态变量支持undefined和null
4
5**变更影响**
6
7API version 9:状态变量不支持undefined和null,当开发者给状态变量设置undefined或者null时,设置失败,即状态变量还是上一次的值。
8
9API version 10:状态变量支持undefined和null,当开发者给状态变量设置undefined和null时,ArkUI框架会接受该值,即下一次读状态变量的是undefined和null,开发者要注意做判空保护。
10
11**适配指导**
12
13API version 9,当开发者给状态变量设置undefined时,设置无效,会导致开发者忽略对undefined的校验。
14```ts
15@Entry
16@Component
17struct Page3 {
18  @State messages: string[] = ['Hello World']
19
20  aboutToAppear() {
21    // AppStorage里没有对应的key,返回undefined
22    // API version 9:赋值不生效,ArkUI框架会拒绝undefined,this.messages还为其初始值['Hello World']
23    // API version 10: 赋值生效,ArkUI框架会接受undefined,this.messages为undefined
24    this.messages = AppStorage.Get("aProp")
25  }
26
27  build() {
28    Row() {
29      Column() {
30        // API version 9: 应用没有crash,length为1
31        // API version 10:应用crash, Error message: Cannot read property length of undefined
32        Text(`the messages length: ${this.messages.length}`)
33          .fontSize(50)
34          .fontWeight(FontWeight.Bold)
35      }
36      .width('100%')
37    }
38    .height('100%')
39  }
40}
41```
42
43对于上述情况,当每一次给状态变量赋值undefined和null时,需要对状态变量是否为undefined做校验。
44
45```ts
46Text(`the messages length: ${this.messages?.length}`)
47```
48
49API version 10,ArkUI框架增强对状态变量类型和初始化的校验,ArkUI框架会抛出运行时报错。具体有以下两种情况:
501. @Link必须被父组件初始化。
51
52对于以下示例,当前会抛出运行时报错,提示开发者需要初始化@Link。
53```ts
54@Entry
55@Component
56struct Page3 {
57  @State aProp: boolean = true
58
59  build() {
60    Row() {
61      Column() {
62        // crash: SynchedPropertyObjectTwoWayPU[9, 'linkProp']: constructor @Link/@Consume source variable in
63        // parent/ancestor @Component must be defined. Application error!
64        LinkChild()
65        // 错误的用常规变量初始化linkProp,ArkUI框架无认为没有初始化,和上述一样的报错
66        LinkChild({ aProp: false })
67        // 正确,用状态变量this.aProp初始化@Link
68        LinkChild({ aProp: this.aProp })
69      }
70      .width('100%')
71    }
72    .height('100%')
73  }
74}
75
76@Component
77struct LinkChild {
78  @Link aProp: boolean
79
80  build() {
81    Text(`linkProp: ${this.aProp}`)
82      .fontSize(50)
83      .fontWeight(FontWeight.Bold)
84  }
85}
86```
87
882. 校验状态变量不支持的类型。
89
90状态变量对于不支持的类型,比如function,抛出运行时报错来提示开发者。
91```ts
92@Entry
93@Component
94struct Page3 {
95  // API version 10:运行时报错:@Component 'Page3': Illegal variable value error with decorated variable @State/@Provide 'functionProp': failed
96  // validation: 'undefined, null, number, boolean, string, or Object but not function, attempt to assign value type: 'function',
97  @State functionProp: () => void = () => {
98    console.info("123")
99  }
100
101  aboutToAppear() {
102    this.functionProp()
103  }
104
105  build() {
106    Row() {
107      Column() {
108        Text("hello")
109      }
110      .width('100%')
111    }
112    .height('100%')
113  }
114}
115```
116
117## cl.arkui.2 更新4.0.10.x sdk后,出现组件功能异常的适配指导
118更新4.0.10.x sdk之后,如果设备未使用配套的镜像版本,应用代码中调用UI组件时,会无法正常显示。
119
120**示例:**
121
122```
123@Entry
124@Component
125struct Index { // 自定义组件
126  build() {
127    Text('Hello, world') // 基础组件
128  }
129}
130```
131
132**变更影响**
133
134更新4.0.10.x sdk之后,如果设备未使用配套的镜像版本,应用代码中调用UI组件时,
135运行到设备上会出现`this.observeComponentCreation2 is not callable`的报错。
136
137**关键的接口/组件变更**
138
139不涉及。
140
141**适配指导**
142
143更新SDK配套的设备镜像。
144
145## cl.arkui.3 List组件滚动条状态设置undefined或非法值处理变更
146
147**变更影响**
148
149OpenHarmony_4.0.10.1之前,开发者设置scrollBar(undefined), scrollBar('aaa'), scrollBar(-1)会处理成BarState.Off状态。</br>
150OpenHarmony_4.0.10.2及之后,开发者设置scrollBar(undefined), scrollBar('aaa'), scrollBar(-1)会处理成默认值BarState.Auto状态。
151
152**关键的接口变更**
153
154List组件scrollBar接口设置undefined或非法值的处理方式由BarState.Off变更为BarState.Auto155
156## cl.arkui.4 Grid组件滚动条状态设置undefined或非法值处理变更
157
158**变更影响**
159
160OpenHarmony_4.0.10.1之前,开发者设置scrollBar(undefined), scrollBar('aaa'), scrollBar(-1)会处理成BarState.Off状态。</br>
161OpenHarmony_4.0.10.2及之后,开发者设置scrollBar(undefined), scrollBar('aaa'), scrollBar(-1)会处理成默认值BarState.Auto状态。
162
163**关键的接口变更**
164
165Grid组件scrollBar接口设置undefined或非法值的处理方式由BarState.Off变更为BarState.Auto166
167
168## cl.arkui.5 NavPathStack类中的方法名称变更
169
170**关键接口/组件变更**
171
172[NavPathStack](../../../application-dev/reference/arkui-ts/ts-basic-components-navigation.md#navpathstack10)
173|  变更前   | 变更后  |
174|  ----  | ----  |
175| push  | pushPath |
176| pushName  | pushNameByPath |
177| popTo| PopToName |
178
179**变更影响**
180
181更新4.0.10.x SDK之后,如果代码未变更方法名称,将出现编译报错。
182Property 'push' does not exist on type 'NavPathStack'.
183Property 'pushName' does not exist on type 'NavPathStack'.
184Property 'pop' does not exist on type 'NavPathStack'.
185
186**适配指导**
187
188需更新应用代码
189
190```ts
191navPathStack = new NavPathStack();
192this.navPathStack.push(...)
193this.navPathStack.pushPath(...)
194
195this.navPathStack.pushName('navidesnation_add',this.value)
196this.navPathStack.pushPathByName('navidesnation_add',this.value)
197
198this.navPathStack.pop('navidesnation_add')
199this.navPathStack.popToName('navidesnation_add')
200```
201
202## cl.arkui.6 setLineDash接口实现变更
203
204**说明**
205setLineDash接口参数number的单位由px变成vp。
206
207**示例:**
208```ts
209@Entry
210@Component
211struct SetLineDash {
212  private settings: RenderingContextSettings = new RenderingContextSettings(true)
213  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
214
215  build() {
216    Flex({ direction: FlexDirection.Column, alignItems: ItemAlign.Center, justifyContent: FlexAlign.Center }) {
217      Canvas(this.context)
218        .width('100%')
219        .height('100%')
220        .backgroundColor('#ffff00')
221        .onReady(() =>{
222          let ctx = this.context
223          ctx.lineWidth = 5
224          ctx.arc(100, 75, 50, 0, 6.28)
225          ctx.setLineDash([10,20])
226          ctx.stroke();
227        })
228      Image('image/SetLineDash.png')
229        .objectFit(ImageFit.Contain)
230    }
231    .width('100%')
232    .height('100%')
233  }
234}
235```
236API version 9:setLineDash接口参数number的单位为px。
237
238![stack](figures/zh_cn_image_setLineDash_change_before.jpeg)
239
240API version 10及以后:setLineDash接口参数number的单位为vp。
241
242![stack](figures/zh_cn_image_setLineDash_change_after.jpeg)
243
244**变更影响**
245
246setLineDash接口参数number的单位由px变为vp,setLineDash接口在API version 9及以前与API version 10及以后的绘制效果不一样。
247
248## cl.arkui.7 Navigation标题自定义位置变更
249
2501. NavigationTitleMode设置为Full、Free或者Mini不带返回键场景。
251
252   API Version 9:保持左边距 24vp。
253
254   API Version 10: 左边距发生更改,由24vp更改为0。上边距由居中显示更改为上边距0。
255
2562. NavigationTitleMode设置为Mini并且显示返回键。
257
258   API Version 9: 自定义标题与返回键间距为16vp。
259
260   API Version 10: 自定义标题栏与返回键间距变更:16vp变更为12vp。
261
2623. 自定义Menu场景。
263
264   API Version 9:右边距为24vp。
265
266   API Version 10: 右边距由24vp变更为0。
267
268**变更原因**
269
270从API Version 9开始,会对Navigation的自定义标题以及自定义Menu添加边距,影响开发者对自定义组件的使用。从4.0.10.6版本对该问题进行优化,针对API Version 10的应用去掉自定义标题标题和自定义Menu的偏移。
271
272**变更影响**
273
274该变更会导致API Version 10中使用Navigation自定义标题位置发生变化,显示会偏左和偏上。针对API Version 9及以下应用无影响。
275
276**适配方法**
277
2781. 针对NavigationTitleMode.Full、Free模式以及NavigationTitleMode.Mini,添加左间距偏移:$r('sys.float.ohos_id_max_padding_start')。
279实现自定标题的居中效果: .height('100%').alignItems(VerticalAlign.Center)
280
2812. 针对NavigationTitleMode设置为Mini模式,并且显示返回键场景: 添加左偏移:.margin({left: 4}),居中效果同上。
282
2833. 针对自定义Menu适配:添加右边距配置: .margin({right: $r('sys.float.ohos_id_max_padding_end')})
284
285
286**示例:**
287```ts
288@Entry
289@Component
290struct Index {
291  @State titleMode: NavigationTitleMode = NavigationTitleMode.Free
292  @State backButton: boolean = false;
293  @Builder CustomMenu() {
294    Column() {
295      Image($r('app.media.icon')).width(24).height(24)
296    }
297  }
298
299  @Builder CustomTitle() {
300    Column() {
301      Text('Custom title').fontSize(20)
302    }
303  }
304
305  build() {
306    Column() {
307      Navigation() {
308        Column() {
309          Text(`Change current title mode: ${this.titleMode}`)
310            .onClick(()=>{
311              if (this.titleMode == NavigationTitleMode.Free) {
312                this.titleMode = NavigationTitleMode.Full;
313              } else if (this.titleMode == NavigationTitleMode.Full) {
314                this.titleMode = NavigationTitleMode.Mini;
315              } else {
316                this.titleMode = NavigationTitleMode.Free;
317              }
318            })
319
320          Text(`Change back button: ${this.backButton}`).onClick(()=>{
321            this.backButton = !this.backButton;
322          }).margin({top: 10})
323        }.margin({top: 40})
324      }.title(this.CustomTitle)
325      .titleMode(this.titleMode)
326      .menus(this.CustomMenu)
327      .hideBackButton(this.backButton)
328    }
329  }
330}
331```
332API Version 9:NavigationTitleMode.Full自定义标题栏以及自定义Menu显示
333
334![Navigation](figures/navigation_full_title_sdk9.png)
335
336API Version 10: NavigationTitleMode.Full自定义标题栏以及自定义Menu显示
337
338![Navigation](figures/navigation_full_title_sdk10.png)
339
340API Version 9: NavigationTitleMode.Mini带返回键自定义标题栏显示
341
342![Navigation](figures/navigation_mini_title_sdk9.png)
343
344API Version 10: NavigationTitleMode.Mini带返回键自定义标题栏显示
345
346![Navigation](figures/navigation_mini_title_sdk10.png)
347
348API Version 9: NavigationTitleMode.Mini不带返回键标题栏显示
349
350![Navigation](figures/navigation_mini_title_no_back_sdk9.png)
351
352API Version 10: NavigationTitleMode.Mini不带返回键标题栏显示
353
354![Navigation](figures/navigation_mini_title_no_back_sdk10.png)
355
356## cl.arkui.8 NavDestination标题栏变更
357
358针对自定义标题:
359
3601. 带返回键场景。
361
362   API Version 9:返回键与标题栏间距为16vp,标题栏居中。
363
364   API Version 10:标题栏与返回键间距变更由16vp变更为12vp,标题栏上偏移该为0。
365
3662. 不带返回键场景。
367
368   API Version 9: 标题栏左间距为24vp,标题栏居中。
369
370   API Version 10:标题栏左间距变更24vp变更为0,标题栏上偏移该为0。
371
372**变更原因**
373
374从API Version 9开始,会对Navigation的自定义标题添加边距,影响开发者对自定义组件的使用。从4.0.10.6版本对该问题进行优化,针对API Version 10的应用去掉自定义标题标题的偏移。
375
376**变更影响**
377NavDestination自定义标题栏会移到左上
378
379**适配方法**
380
381应用如果要保持之前的显示效果,可以采用如下方案适配:
382
3831. 针对不带返回键的场景,添加左偏移: margin({left: $r('sys.float.ohos_id_max_padding_start')}),
384添加居中效果 .height('100%').alignItems(VerticalAlign.Center)
385
3862. 针对带返回键场景,添加做偏移:margin({left: 4}),居中实现效果同上。
387
388**示例:**
389```ts
390@Entry
391@Component
392struct Index {
393  @Builder NavigationTile() {
394    Column() {
395      Text('title').fontColor('#182431').fontSize(30).lineHeight(41)
396      Text('subTitle').fontColor('#182431').fontSize(14).lineHeight(19).margin(top:2, bottom: 20)
397    }
398  }
399
400  build() {
401    Column() {
402      Navigation() {
403        Text('Navigation')
404      }.title(this.NavigationTitle)
405       .titleMode(NavigationTitleMode.Free)
406       .menus([
407        {icon: 'common/image/icon.png', value: 'menu1'}
408       ])
409    }
410  }
411}
412```
413
414API Version 9:带返回键自定义标题页面
415
416![NavDstination](figures/navdestination_back_sdk9.png)
417
418API Version 10: 带返回键自定义标题页面
419
420![NavDestination](figures/navdestination_back_sdk10.png)
421
422API9: 不带返回键自定义标题页面
423
424![NavDestination](figures/navdestination_no_back_sdk9.png)
425
426API10: 不带返回键自定义标题页面
427
428![NavDestination](figures/navdestination_no_back_sdk10.png)
429
430## cl.arkui.9 NavRouter回调OnStateChange变更
431
432OnStateChange调用次数修复:
433
434针对目标显示NavDestination的OnStateChange回调由调用2次,修复为调用1次,调用顺序不受影响。
435
436**变更影响**
437
438利用OnStateChange调用时序处理的应用会受到影响。
439
440   更改之前调用时序:目标显示NavRouter触发OnStateChange(true) -> 退出NavRouter触发OnStateChange(false) -> 目标显示NavRouter触发OnStateChange(true)
441
442   更改之后调用时序:目标显示NavRouter触发OnStateChange(true) -> 退出NavRouter触发OnStateChange(false)
443
444## cl.arkui.10 PanelHeight枚举的WRAP_CONTENT值从0变更为'wrapContent'
445
446**变更影响**
447
448变更前,开发者设置customHeight(0)和customHeight(PanelHeight.WRAP_CONTENT)都会自适应内容高度。</br>
449变更后,开发者设置customHeight(0)将内容高度设置为0,customHeight(PanelHeight.WRAP_CONTENT)自适应内容高度。
450
451**关键的接口变更**
452
453PanelHeight枚举的WRAP_CONTENT值从0变为'wrapContent',接口行为变更对开发者无影响。
454
455## cl.arkui.11 aspectRatio设置非法值和undefined时,默认值从1.0变为null。
456
457**变更影响**
458
459变更前,开发者设置负数和undefined,aspectRatio = 1.0
460
461变更后,开发者设置负数和undefined,aspectRatio为null。例如,Row只设置宽度且没有子组件,aspectRatio不设置值或者设置成负数时,此时Row高度为0。
462
463## cl.arkui.12 defaultFocus设置为true由不生效变更为生效。
464
465**变更影响**
4664.0.9.1版本之前,开发者defaultFocus设置为true不生效
467
4684.0.9.1版本及之后,开发者defaultFocus设置为true生效
469
470## cl.arkui.13 焦点tabIndex走焦方式由非循环走焦更改为循环走焦。
471
472**变更影响**
4734.0.10.2版本之前,焦点tabIndex走焦方式为非循环走焦
474
4754.0.10.2版本及之后,焦点tabIndex走焦方式为循环走焦
476
477## cl.arkui.14 TextInput设置margin属性时,TextInput的Constraint不再减去Margin的值。
478
479**变更影响**
480
4814.0.10.2版本之前,TextInput设置margin时,TextInput的Constraint会减去所设置margin的值。
482
4834.0.10.2版本及之后,TextInput设置margin时,TextInput的Constraint不会减去所设置margin的值。
484
485
486## cl.arkui.15 button组件对fontSize设置为负数(即异常值)时的处理规则进行细化,保证取值合理性。
487
488**变更影响**
489
490变更前,开发者设置负数时,fontSize为开发者设置的负数值,即最终效果与fontSize=0的效果一致,文字内容不显示<br>
491变更后,开发者设置负数时,fontSize为默认值16fp。<br>
492说明:fontSize=0的效果未变更,都是文字不显示的效果,以上变更仅涉及开发者设置fontSize<0的异常场景
493
494## cl.arkui.16 Search组件动态改变属性时,输入框内容变化情况变更,保证输入框内容的正确性。
495
496**变更影响**
497
498变更前,开发者在Search组件接口中只设置placeholder不设置value时,动态改变Search的属性,Search中的内容会被清空。<br>
499变更后,开发者在Search组件接口中只设置placeholder不设置value时,动态改变Search的属性,Search中的内容会保持不变。
500说明:变更后为正常使用search的期望行为。
501
502## cl.arkui.17 Menu组件宽度规格变更
503
504[Menu](../../../application-dev/reference/arkui-ts/ts-basic-components-menu.md)宽度规格变更,未设置宽度时,按默认2栅格显示;设置宽度时,Menu内容根据设置的宽度进行自适应布局。Menu组件自带默认64vp的最小宽度。
505
506**变更影响**
507
5081. Menu宽度默认2栅格显示,若菜单项[MenuItem](../../../application-dev/reference/arkui-ts/ts-basic-components-menuitem.md)内容区比2栅格宽,则会自适应撑开。
5092. 最小宽度64vp。开发者可通过[constraintSize](../../../application-dev/reference/arkui-ts/ts-universal-attributes-size.md)属性修改最小宽度限制。
510
511**关键接口/组件变更**
512
513- [Menu组件](../../../application-dev/reference/arkui-ts/ts-basic-components-menu.md)
514
515**适配指导**
516
517若开发者期望菜单显示宽度小于64vp或无最小宽度限制,修改constraintSize覆盖默认的最小宽度。
518
519**示例:**
520```ts
521@Entry
522@Component
523struct Index {
524  @Builder
525  MyMenu(){
526    Menu() {
527      MenuItem({ startIcon: $r("app.media.icon"), content: "菜单选项" })
528    }
529    .width(30)
530    .constraintSize({minWidth: 0})  // 覆盖系统默认的64vp最小宽度
531  }
532
533  build() {
534    Row() {
535      Column() {
536        Text('click to show menu')
537      }
538      .bindMenu(this.MyMenu)
539      .width('100%')
540    }
541    .height('100%')
542  }
543}
544```
545
546## cl.arkui.18 springCurve速度方向规格变更
547
548**变更影响**
549
550在API version 9,[springCurve](../../../application-dev/reference/apis/js-apis-curve.md#curvesspringcurve9)的[interpolate](../../../application-dev/reference/apis/js-apis-curve.md#interpolate9)方法在计算时,springCurve的初速度>0为逆着终点方向,初速度<0为顺着终点方向。<br/>
551从API version 10起,springCurve的interpolate方法在计算时,springCurve的初速度>0为顺着终点方向,初速度<0为逆着终点方向。会导致初速度不为0时springCurve的interpolate方法和API version 10之前的计算结果不一致。
552
553## cl.arkui.5 springCurve实际曲线时间估算阈值规格变更
554
555**变更影响**
556
557在API version 9,[springCurve](../../../application-dev/reference/apis/js-apis-curve.md#curvesspringcurve9)的[interpolate](../../../application-dev/reference/apis/js-apis-curve.md#interpolate9)方法对springCurve实际曲线时长的最长估算时间为1秒,当物理曲线时长超过1秒时,按1秒估算,导致超过1秒的springCurve的动画时间归一化不正确,插值结果在t=1时会跳变。<br/>
558从API version 10起,springCurve的interpolate方法对springCurve的最长估算时间为1000秒,对于绝大多数正常springCurve曲线均能正确估算动画时长。会导致物理曲线本身时长超过1秒的springCurve的interpolate方法和API version 10之前的计算结果不一致。
559
560## cl.arkui.19 用户界面外观服务接口行为变更。
561
5624.0.10.3版本开始,系统接口setDarkMode和getDarkMode返回信息的方式和内容发生变更,需要根据适配指导进行适配。
563
564**变更影响**
565
566基于此前版本开发的系统应用,对返回值的处理需适配新的方式,否则会影响原有业务逻辑。
567
568**关键的接口/组件变更**
569
570涉及接口如下:
571- setDarkMode接口在Callback调用方式下,异常情况的处理由只抛出错误码ID变更为抛出错误码ID和错误码信息;
572- setDarkMode接口在Promise调用方式下,异常情况的处理由只抛出错误信息变更为抛出错误码ID和错误码信息;
573- setDarkMode接口在Callback调用方式下,正常情况的第一个参数由返回0变更为返回null;
574- getDarkMode接口在异常情况下由直接返回2变更为抛出异常,需要通过错误码ID和错误码信息判断报错类型。
575
576**说明**:异常情况指参数错误、未配置权限及内部执行出错等未预期的行为,正常情况指未产生错误的预期行为。
577
578**适配指导**
579
580请参考[ @ohos.uiAppearance(用户界面外观)](../../../application-dev/reference/apis/js-apis-uiappearance.md)接口的API参考。
581