StatusBar 深浅模式文字适配
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_bb1f0d09/statusbar-dark-light-fix。
技能介绍
要解决的问题
App 在浅色与深色模式间切换时,系统状态栏的文字颜色不跟随主题:浅色模式下背景为白色,文字仍为白色,状态栏内容几乎不可见。问题根源在国产 ROM(小米 MIUI、魅族 Flyme)对系统状态栏 API 的定制:@capacitor/status-bar 的 StatusBar.setStyle() 在这些设备上可能被系统 UI 覆盖,导致文字颜色切换静默失效。深色模式看似正常,实际只是碰巧匹配,仍然由同一套机制控制。
核心能力与关键步骤
该技能采用双保险策略,同时使用 Capacitor API 与原生 Bridge:
- 原生桥接层:在
android/app/src/main/java/com/zhimaquan/app/MainActivity.java中添加@JavascriptInterface桥接方法,并在onCreate中注册,让 JS 可以直接驱动原生状态栏控制。 - JS 调用层:在
src/app/App.jsx中结合 Capacitor API 与原生 Bridge 调用,根据当前主题设置文字颜色。 - 重试机制:JS 注册时 WebView 可能尚未就绪,Bridge 调用最多重试 10 次、间隔 100ms。
- 版本分流:Android 11+ 使用
WindowInsetsController,Android 6-10 使用SYSTEM_UI_FLAG_LIGHT_STATUS_BAR。 - 验证:切换浅色(白底深字)与深色(深蓝底白字),反复切换 2-3 次确认稳定。
适用边界与注意点
setOverlaysWebView({ overlay: true })绝对不能开,否则深色模式文字同样不可见,只有 overlay 为false时策略才有效。compileSdk需 >= 30 才能编译WindowInsetsController;修改MainActivity.java后必须执行npx cap sync android同步 Java 源文件,再执行./gradlew assembleRelease,否则桥接不生效。- 只加原生桥接而不在 JS 端主动调用是不够的——桥接只是通道,需要 JS 主动调用。
- import 需按需引入,避免一次性导入版本不兼容的类。
使用场景
- App浅色模式下状态栏文字白色看不清,需要修复文字颜色适配主题
- 小米/魅族手机状态栏切换主题不生效,需排查ROM定制问题并修复
- Capacitor项目需同时用API和原生Bridge实现状态栏适配,保证兼容
- 修改MainActivity后JS桥接不生效,需排查同步与重试逻辑
适合人员
- 前端开发者,诉求是修复Capacitor应用状态栏在深浅模式下的文字显示异常
- 移动端工程师,诉求是解决国产ROM状态栏API被覆盖导致的颜色切换失效
- 跨平台开发者,诉求是在混合应用中实现状态栏与主题联动的稳定适配
- 测试工程师,诉求是验证深浅模式切换时状态栏文字颜色的兼容性