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.Auto。 155 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.Auto。 166 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 239 240API version 10及以后:setLineDash接口参数number的单位为vp。 241 242 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 335 336API Version 10: NavigationTitleMode.Full自定义标题栏以及自定义Menu显示 337 338 339 340API Version 9: NavigationTitleMode.Mini带返回键自定义标题栏显示 341 342 343 344API Version 10: NavigationTitleMode.Mini带返回键自定义标题栏显示 345 346 347 348API Version 9: NavigationTitleMode.Mini不带返回键标题栏显示 349 350 351 352API Version 10: NavigationTitleMode.Mini不带返回键标题栏显示 353 354 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 417 418API Version 10: 带返回键自定义标题页面 419 420 421 422API9: 不带返回键自定义标题页面 423 424 425 426API10: 不带返回键自定义标题页面 427 428 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