以下场景仅在两台手机(Android 10 + MIUI 12 和 Android 11 + MIUI 12.5)上测试过,其他机型不确定。
文档是都有提到深色模式的用法,但我觉得场景限定得太死。比如:
app.json[darkmode] = false 限制了小程序窗体颜色自动变换,onThemeChange的变换回调,getSystemInfo[theme]当前主题的返回。
app.json[darkmode] = true 则在手动切换或某些系统提供了定时切换主题模式后,会导致正在运行的小程序重载(重启),导致小程序的一些操作和数据丢失。
问题在现在的限制下,业务上是希望能适配主题的切换但又不想小程序重新加载,我想到的办法是WXSS使用媒体查询 prefers-color-scheme + onThemeChange中修改窗体颜色。问题是小程序不重载要求app.json[darkmode]为false,但这不会触发onThemeChange回调,getSystemInfo[theme]也没有返回。
我觉得onThemeChange和getSystemInfo可以不依赖darkmode的设置值。
此外,即使配置了darkmode为true,切换主题后因为小程序重载了,且onThemeChange不会触发?那这个功能真是鸡肋。
ios 切换深色模式不会重新加载;安卓切换是对齐微信切换深色模式会重新加载;
我估摸了个解决办法:给对应组件在@media (prefers-color-scheme: dark) 里修改颜色、添加transition过渡,同时给该组件添加bindtransitionend事件,就能在darkmode:false时监听主题的变换了,而且不会导致小程序重启