Flutter设置immersiveSticky后出现黑色状态栏(vivo设备)求助
解决vivo设备Flutter沉浸式状态栏黑色条+通知图标残留问题
问题场景
在Flutter应用中尝试通过SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky);实现全屏移除状态栏,无论在main()入口还是页面initState()中设置,都会出现黑色状态栏区域;即使尝试以下操作仍无法解决核心问题:
- 设置状态栏为透明/白色
- 切换
immersive/leanBack等系统UI模式 - 修改状态栏及图标亮度
关键现象:通知的黑色图标会在"隐藏"的状态栏区域清晰显示,手动将vivo设备的「相机区域适配」从「自动适配(让应用决定)」改为「显示相机区域」后问题完全消失,需实现应用自动触发该设置。
解决方案
这是vivo设备专属的系统适配逻辑,Flutter框架无直接对应API,需通过Android原生配置配合Flutter代码实现:
1. 配置AndroidManifest.xml
在android/app/src/main/AndroidManifest.xml中,给<application>或目标页面的<activity>添加vivo专属meta-data:
<meta-data android:name="android.vivo.notch.config" android:value="portrait|landscape" />
参数说明:
portrait:允许竖屏显示相机区域landscape:允许横屏显示相机区域
仅需竖屏适配时,可只写portrait。
2. 保留Flutter沉浸式设置
维持原有Flutter代码的系统UI模式设置,确保全屏逻辑生效,可额外添加状态栏透明配置增强适配:
class Example extends StatefulWidget { const Example({super.key}); @override State<Example> createState() => _ExampleState(); } class _ExampleState extends State<Example> { @override void initState() { super.initState(); // 设置沉浸式粘性状态栏 SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky); // 确保状态栏透明,消除残留底色 SystemChrome.setSystemUIOverlayStyle(const SystemUiOverlayStyle( statusBarColor: Colors.transparent, )); } @override Widget build(BuildContext context) { return Container(); } }
原理说明
vivo的「相机区域适配」逻辑会读取应用的meta-data配置:添加上述配置后,系统会默认采用「显示相机区域」模式,替代原来的「自动适配」,从而消除黑色状态栏条,让Flutter的沉浸式设置真正生效,避免通知图标在残留区域显示。
注意事项
- 该配置仅对vivo设备生效,不会影响其他品牌设备的正常运行
- 若需适配更多品牌的刘海/挖孔屏,可添加对应厂商的专属meta-data配置,本次仅针对vivo场景处理即可
内容的提问来源于stack exchange,提问作者CodeVault
相关产品推荐
相关产品推荐

