## uni.setAppTheme(options) @setapptheme uni.setAppTheme,并不会帮助开发者自动实现整个应用的亮/暗主题切换,它的作用是: 1. 根据[theme.json](../collocation/themejson.md),设置pages.json的亮/暗主题 2. 触发uni.onAppThemeChange,开发者和组件作者均可监听这个事件,自行响应将页面设置为对应的亮/暗风格。 当然组件作者也可以不监听onAppThemeChange,而是暴露主题切换API给开发者,由开发者监听主题切换,再调用组件的主题切换API。 目前uni-app x的内置组件和UI相关的API(比如showModal),并不会响应setAppTheme。组件是暴露了样式属性供开发者自行设置,Modal相关API目前没有样式设置,后续会升级支持。 ```uts uni.setAppTheme({ theme: "auto", success: function() { console.log("设置appTheme为 auto 成功") }, fail: function(e: IAppThemeFail) { console.log("设置appTheme为 auto 失败,原因:", e.errMsg) } }) ``` ## uni.onAppThemeChange(callback) @onappthemechange **版本历史调整** - HBuilderX 4.18版本的逻辑是:[uni.setAppTheme](#setapptheme) 设置的 theme 值变化时触发本监听回调,回调参数中的 appTheme 值可能是"light" | "dark" | "auto"。在 app 平台设置应用的 theme 值为 auto 后,需再次查询osTheme来判断当前的真实主题。如果应用主题是auto,那么需要同时监听osTheme的变化。 - HBuilderX 4.19版本调整为:应用的light/dark主题真正发生变化时触发监听回调。无论是手动设置setAppTheme还是跟随osTheme变化,只要真正变化了就会触发本监听。回调参数中的 appTheme 值只能是"light" | "dark"。 ```uts //callbackId 用于注销监听 val callbackId = uni.onAppThemeChange((res: AppThemeChangeResult) => { console.log("onAppThemeChange", res.appTheme) }) ``` ## uni.offAppThemeChange(id) @offappthemechange ```uts val callbackId = uni.onAppThemeChange((res: AppThemeChangeResult) => { console.log("onAppThemeChange", res.appTheme) }) //... //... //注销监听 uni.offAppThemeChange(this.appThemeChangeId) ``` ## uni.onOsThemeChange(callback) @onosthemechange ```uts //callbackId 用于注销监听 val callbackId = uni.onOsThemeChange((res: OsThemeChangeResult)=> { console.log("onOsThemeChange---", res.osTheme) }) ``` **注意:** + android 10、iOS 13 才开始支持深色模式主题 `dark`,更低版本无法获取、监听OS的主题。 ## uni.offOsThemeChange(id) @offosthemechange ```uts val callbackId = uni.onOsThemeChange((res: OsThemeChangeResult)=> { console.log("onOsThemeChange---", res.osTheme) }) ... ... //注销监听 uni.offOsThemeChange(callbackId) ```