• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# ArkUI子系统Changelog
2
3## cl.arkui.1 默认深浅色切换流程变更
4
5**访问级别**
6
7其他
8
9**变更原因**
10
11针对深浅色模式切换等系统配置的热更新场景,当前的实现方式会导致整个组件树重新构建,进而使得TS层的UI代码重新执行。在页面结构较为复杂时,这种处理方式会显著降低时间性能。我们需要对此进行优化。
12
13**变更影响**
14
15此变更涉及应用适配
16
17- 变更前:系统配置热更新场景下,组件树重新构建,相关属性设置的代码重新执行,存在大量不涉及深浅色变更的冗余开销。
18
19- 变更后:开发者在属性中调用的方法不会再被触发。因此,如果有开发者在属性设置中使用了函数的方式去适配深浅色变化,那么变更后将会失效。
20
21**起始API Level**
22
23不涉及API
24
25**变更发生版本**
26
27从OpenHarmony SDK 6.0.1.2开始。
28
29**变更的接口/组件**
30
31不涉及具体接口/组件
32
33**适配指导**
34
35上面的适配方式虽然在旧版本能够生效,但并不是合理的适配方式,变更后将不再支持。
36开发者可以根据自己的业务场景,按照如下正确方式进行深浅色模式适配:
37方法一:对于仅仅是深浅色模式下显示类资源的自定义配置场景,比如上面代码中的背景色切换,推荐开发者采用资源目录配置的方式适配深浅色。
38参考开发指南:[应用深浅色适配](../../../application-dev/ui/ui-dark-light-color-adaptation.md)
39方法二:对于在不同颜色模式下有比较复杂的定制业务逻辑的场景,开发者需要在Ability类提供的系统配置变更回调中监听配置变更,当深浅等配置变化时通过绑定状态变量等方式进行适配,[参考API文档](../../../application-dev/reference/apis-ability-kit/js-apis-app-ability-ability.md#abilityonconfigurationupdate)
40下面是一个简单的例子:
41
42```ts
43@Entry
44@Component
45struct Index {
46  // 深浅色适配函数
47  getBackgroundColor(): ResourceColor {
48    // let isDark = getSystemColorMode(); 通过媒体查询等方式获取当前系统颜色模式
49    // some other codes  其他的定制逻辑
50    return isDark ? Color.Blue : Color.Black; // 返回自定义颜色值
51  }
52  build() {
53    RelativeContainer() {
54      Column()
55        .width(100)
56        .height(100)
57        // 依赖backgroundColor()属性设置接口重新执行,才会重新执行getBackgroundColor()完成正确切换
58        .backgroundColor(this.getBackgroundColor())
59    }
60    .height('100%')
61    .width('100%')
62  }
63}
64```
65
661、通过程序启动时,在UIAbility中重写onConfigurationUpdate监听配置变化。
67```ts
68// EntryAbility.ts
69  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
70    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
71    AppStorage.setOrCreate('currentColorMode', this.context.config.colorMode);
72
73  }
74
75  onConfigurationUpdate(newConfig: Configuration): void {
76    AppStorage.setOrCreate('currentColorMode', newConfig.colorMode);
77  }
78```
79
802、在需要适配的地方通过[AppStorage能力](../../../application-dev/ui/state-management/arkts-appstorage.md)进行适配。
81
82```ts
83import { ConfigurationConstant } from '@kit.AbilityKit';
84
85@Entry
86@Component
87struct Index {
88  @State isDark: boolean = false;
89  @StorageProp('currentColorMode') @Watch('onColorModeChange') currentMode: number =
90    ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT;
91
92  onColorModeChange(): void {
93    // 也可以实现更加复杂的应用自定义的适配逻辑,这里用一个颜色变量的设置作为简单例子
94    this.isDark = (this.currentMode === ConfigurationConstant.ColorMode.COLOR_MODE_LIGHT) ? false : true;
95    this.columColor = this.isDark ? Color.Blue : Color.Black;
96  }
97
98  getBackgroundColor(): ResourceColor {
99    return this.isDark ? Color.Blue : Color.Black;
100  }
101
102  // 通过状态变量触发页面更新逻辑
103  @State columColor: ResourceColor = Color.Black;
104
105  build() {
106    RelativeContainer() {
107      Column()
108        .width(100)
109        .height(100)
110        .backgroundColor(this.getBackgroundColor())// 变更前
111        .backgroundColor(this.columColor)
112    }
113    .height('100%')
114    .width('100%')
115  }
116}
117```
118
119## cl.arkui.2 WithTheme组件设置colorMode后效果异常问题修复
120
121**访问级别**
122
123公开
124
125**变更原因**
126
127WithTheme组件指定局部主题的能力对某些组件不生效。例如:通过WithTheme设置主题深浅色为DARK或LIGHT后,Button子组件使用的资源仍会依循系统深浅色变化。
128
129**变更影响**
130
131此变更涉及应用适配
132
133- 变更前:WithTheme组件设置了主题后,其子组件的主题仍旧跟随系统切换。
134
135- 变更后:WithTheme组件设置了主题后,其中的子组件使用指定的主题,不跟随系统切换。
136
137 **变更涉及组件范围**
138
139  变更前部分组件未适配WithTheme,因此其作为WithTheme子组件不受指定的主题影响,因此变更后这部分组件的行为会受到影响。变更前后会受到影响的具体组件类型列表如下:
140
141  TextArea、Search、Button、DatePicker、TextPicker、TimePicker、AlphabetIndexer、Swiper、Scroll、Tabs、TabContent、RichEditor、Menu、MenuItem、Counter、Progress、TextClock、LoadingProgress。
142
143**起始API Level**
144
14512
146
147**变更发生版本**
148
149从OpenHarmony SDK 6.0.1.2开始。
150
151**变更的接口/组件**
152
153 WithTheme
154
155**适配指导**
156
157变更后,WithTheme组件指定的主题对子组件生效。若需适配,应针对发生变化的组件增加WithTheme,并指定其主题跟随系统,例如设置colorMode属性为SYSTEM。
158
159```ts
160// index.ets
161@Entry
162@Component
163struct Index {
164  build() {
165    Column() {
166      // 设置组件为深色模式
167      WithTheme({ colorMode: ThemeColorMode.DARK }) {
168      // 适配:设置colorMode为ThemeColorMode.SYSTEM
169        Column() {
170          Text('WithTheme')
171            .fontSize(40)
172            .fontWeight(FontWeight.Bold)
173          Text('DARK')
174            .fontSize(40)
175            .fontWeight(FontWeight.Bold)
176        }
177        .justifyContent(FlexAlign.Center)
178        .width('100%')
179        .height('33%')
180        .backgroundColor($r('sys.color.background_primary'))
181      }
182    }
183    .height('100%')
184    .expandSafeArea([SafeAreaType.SYSTEM],
185      [SafeAreaEdge.TOP, SafeAreaEdge.END, SafeAreaEdge.BOTTOM, SafeAreaEdge.START])
186  }
187}
188```
189
190## cl.arkui.3 ListItem组件创建行为变更
191**访问级别**
192
193公开接口
194
195**变更原因**
196
197如果ListItem组件不是通过LazyForEach和Repeat动态生成,创建ListItem时会执行两次ListItem的属性方法,需要优化为只执行一次属性方法以提升性能。
198
199**变更影响**
200
201此变更涉及应用适配,只涉及ListItem组件。
202
203变更前:如果ListItem组件不是通过LazyForEach和Repeat动态生成,创建ListItem时会执行两次ListItem的属性方法。
204
205变更后:ListItem在创建时只执行一次属性方法。
206
207如下代码运行后,变更前会打印两次“GetWidth”,变更后只会打印一次“GetWidth”。
208
209```ts
210@Entry
211@Component
212struct ListItemExample {
213  getWidth(): string {
214    console.log("GetWidth");
215    return "100%"
216  }
217  build() {
218    Column() {
219      List({ space: 20, initialIndex: 0 }) {
220        ListItem() {
221          Text('Item')
222        }
223        .width(this.getWidth())
224      }.width('90%')
225    }.width('100%').height('100%')
226  }
227}
228```
229
230**起始API Level**
231
232API 7
233
234**变更发生版本**
235从OpenHarmony SDK 6.0.1.2开始。
236
237**变更的接口/组件**
238
239ListItem组件。
240
241**适配指导**
242
243需要排查ListItem属性方法中是否有调用函数获取属性值,排查函数调用次数是否对业务有影响,如果有影响需要根据实际业务场景适配。
244
245## cl.arkui.4 FullScreenLaunchComponent嵌入式运行元服务内容区避让系统安全区行为变更
246**访问级别**
247
248公开接口
249
250**变更原因**
251
252通过FullScreenLaunchComponent拉起嵌入式运行元服务时,元服务的windowMode为undefined, 元服务的页面内容在任何场景下都不会避让系统安全区,嵌入式运行元服务和跳出式运行元服务页面默认避让行为不一致,需要元服务的开发者针对嵌入式场景主动做避让适配。
253
254**变更影响**
255
256此变更涉及应用适配。
257
258说明:宿主是拉起方,即FullScreenLaunchComponent组件使用方,提供方是被嵌入式运行的元服务。
259
260- 变更前:提供方的windowMode不跟随宿主,默认值为undefined,所有场景下,元服务的页面内容都不会默认避让系统安全区,需要提供方开发者主动避让。
261
262- 变更后:提供方的windowMode跟随宿主保持一致,在宿主windowMode为全屏显示的场景下,并且提供方未主动设置页面为沉浸式,提供方页面会默认避让系统安全区,无需提供方开发者主动避让
263
264|                   变更前                   |                 变更后                  |
265| :----------------------------------------: | :-------------------------------------: |
266| ![](figures/fullScreenLainchComponent/earlier_than_20.jpg) | ![](figures/fullScreenLainchComponent/api20.jpg) |
267
268**起始API Level**
269
270API 12
271
272**变更发生版本**
273从OpenHarmony SDK 6.0.1.2开始。
274
275**变更的接口/组件**
276
277FullScreenLaunchComponent组件及嵌入式拉起的元服务。
278
279**适配指导**
280
281- 宿主的targetsdkversion >= 20。
282  - 建议宿主应用在6.0及以上版本使用嵌入式运行元服务,5.x版本建议使用跳出式运行元服务,提供方元服务无需在嵌入式场景主动避让适配。
283  - 如果宿主应用需要在5.x使用嵌入式运行元服务,需要提供方元服务针对嵌入式场景做适配,需要判断提供方元服务的ohos.extra.atomicservice.param.key.isFollowHostWindowMode,如果ohos.extra.atomicservice.param.key.isFollowHostWindowMode为true,无需主动避让适配;否则需要主动避让适配。
284
285- 宿主的targetsdkversion < 20。
286  - 不建议宿主应用使用嵌入式运行元服务,建议使用跳出式运行元服务。
287  - 如果宿主应用需要使用嵌入式运行元服务,提供方元服务需要判断ohos.extra.atomicservice.param.key.isFollowHostWindowMode,若ohos.extra.atomicservice.param.key.isFollowHostWindowMode为true,无需主动避让适配;否则需要主动避让适配。
288```ts
289export default class AtomicServiceAbility extends EmbeddableUIAbility {
290  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
291    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
292    if (want.parameters) {
293      hilog.info(0x0000, 'testTag', '%{public}s', 'followed host window mode' + want.parameters['ohos.extra.atomicservice.param.key.isFollowHostWindowMode']);
294    }
295  }
296}
297```