1# ArkUI子系统changelog 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