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 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 199 200变更后,修复了上面示例中组件冻结接口不生效的行为,变更后的行为是: 201- 页面1的子组件Child,设置`freezeWhenInactive: true`, 开启了组件冻结功能。 202- 点击Button跳转到页面2,然后延迟1s更新状态变量`bookTest`。在更新`bookTest`的时候,已经跳转到页面2,页面1的组件处于inactive状态,又因为Child组件开启了组件冻结,状态变量`@Local bookTest`将不响应更新,其@Monitor不会调用,状态变量关联的节点不会刷新。 203 204变更后trace如下: 205 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||| 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```