HarmonyOS鸿蒙Next中实现用户可以自定义应用内的背景图,但是做了深浅色适配后,移除壁纸后出现深色模式背景白屏 并没有切换深色背景

HarmonyOS鸿蒙Next中实现用户可以自定义应用内的背景图,但是做了深浅色适配后,移除壁纸后出现深色模式背景白屏 并没有切换深色背景 实现用户可以自定义应用内的背景图,但是做了深浅色适配后,移除壁纸后出现深色模式背景白屏 并没有切换深色背景,我写了个最小demo,按钮实现切换深色背景不生效:

@Entry
@Component
struct BadThemeDemo {
    @State mode: string = 'light'
    private get bgColor(): string {
        return this.mode === 'dark' ? '#1E1E1E' : '#FFFFFF'
    }
    build() {
        Column() {
            Button('切换深色')
                .onClick(() => {
                    this.mode = this.mode === 'dark' ? 'light' : 'dark'
                })
            Text('背景不会正确刷新')
                .fontSize(20)
        }
        .width('100%')
        .height('100%')
        .backgroundColor(this.bgColor)
    }
}

这是为什么


更多关于HarmonyOS鸿蒙Next中实现用户可以自定义应用内的背景图,但是做了深浅色适配后,移除壁纸后出现深色模式背景白屏 并没有切换深色背景的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

ArkUI 只监听“UI 里直接使用的 @State”,不监听 getter 计算值,所以主题变量必须直接写在 UI 表达式中才能生效。可参考:

@Entry
@Component
struct GoodThemeDemo {

  [@State](/user/State) mode: string = 'light'

  build() {

    Column() {

      Button('切换深色')

        .onClick(() => {

          this.mode = this.mode === 'dark' ? 'light' : 'dark'

        })

      Text('背景正确切换')

        .fontSize(20)

    }

    .width('100%')

    .height('100%')

    .backgroundColor(

      this.mode === 'dark' ? '#1E1E1E' : '#FFFFFF'

    )

  }

}

更多关于HarmonyOS鸿蒙Next中实现用户可以自定义应用内的背景图,但是做了深浅色适配后,移除壁纸后出现深色模式背景白屏 并没有切换深色背景的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


监听一下mode
@State @Wach(‘bgColor’) mode: string = ‘light’
bgColor(): string {
return this.mode === ‘dark’ ? ‘#1E1E1E’ : ‘#FFFFFF’
},

移除壁纸后未触发深色模式背景切换,检查移除逻辑中是否将背景资源重置为系统资源引用。确保在移除自定义壁纸时,使用 ResourceTable 中的深色背景资源(如 ohos:color/background_dark),并重新通过 setBackground 方法设置。若使用 Drawable,需绑定 Theme 变化监听。

问题出在 bgColor 作为 getter 属性没有建立响应式依赖。虽然 mode@State,点击会触发 build 重新执行,但 backgroundColor(this.bgColor) 中的 this.bgColor 只是一个普通计算,ArkUI 可能无法精准追踪其与 mode 的依赖关系,导致视图未刷新的现象,尤其在部分复杂场景或模拟器上容易出现。

修复方法:直接将背景色定义为 @State 变量,在切换模式时同步更新。

@State bgColor: string = '#FFFFFF'

onClick(() => {
  this.mode = this.mode === 'dark' ? 'light' : 'dark'
  this.bgColor = this.mode === 'dark' ? '#1E1E1E' : '#FFFFFF'
})

Column()
  .backgroundColor(this.bgColor)

这样状态变化明确,背景色会立即随深浅模式切换生效。

回到顶部