解决方案:uni-app非nvue模式下切换主题后,App端闪屏、闪白、闪黑、状态栏主题色不稳定

uni-app主题色的BUG
- 解决步骤
- 给App添加主题色的缓存标识
- 新建 __uniappview.html 文件
- 引入 copy-webpack-plugin 依赖
- 创建 vue.config.js 文件
- 状态栏颜色不稳定
- 结论
- 主题切换采用的方案是 css 变量
- 使用的编译版本是 3.1.X (也就是HBuilderx的版本号)
- 2.6.X 之后静止在js内动态引入css,所以这是一条死路
问题初探:
uni-app 使用非nvue模式进行编译App,会使用 web-view进行渲染。调试过程中发现,在进行加载静态资源的时候会首先读取默认的配置文件,并进行App主题的初始化,并且在加载其它页面的时候也会去重载默认的配置文件,然后再以加载我们正常的业务页面,在渲染业务页面之前的这段时间内,主题色会一直保持manifest.json内默认的配置色,或在main.js文件中预先加载的主题色。所以以这个思路去处理一下加载的静态文件,以处理切换主题色后闪屏的问题。
解决步骤
给App添加主题色的缓存标识
这段代码是通过 HTML5+的Api,为App添加主题标识的缓存。
新建 __uniappview.html 文件
__uniappview.html 文件是uni-app App 模式的入口页,所以在这里修改比较合理
__uniappview.html 源文件:github
新建:__uniappview.html (建议放至 [ assets ] 目录下,默认是没有这个目录)
在调试过程中发现,首先加载的是这个HTML,所以把设置主题色的代码放在了这个HTML
。这个HTML是在编译过程中导入的入口文件,每次离线打包后也可看到这个文件。
引入 copy-webpack-plugin 依赖
项目内使用的是:5.0.0 版本
创建 vue.config.js 文件
状态栏颜色不稳定
这个问题也是默认配置的坑,初步观察的原理很简单,就是页面已经渲染出来了,但是又做了跳转当前页面动作、之类的动作,导致页面没有重新加载,但是配置重新加载了~ 所以uni-app的壳就把状态栏主题色恢复为默认了。
解决办法就是只要当前页面栈已经存在某个页面,就不做跳转之类的动作!
结论
以上方案,可解决闪屏问题,但是有一个小问题。就是在切换主题色后,切换的第一个页面还会闪一下。业务至此,接着搬下一块砖!!! 有更好的解决方案,或谁把这个遗留问题解决了下方评论,万分感激~