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