You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 12:24:58