Flutter Android端如何获取状态栏/导航栏的当前颜色与样式?
Flutter 读取当前系统状态栏/导航栏样式的可行方案
问题原因
你之前的方法无法生效的核心原因:SystemUiOverlayStyle.dark 和 SystemUiOverlayStyle.light 是 Flutter SDK 内置的预设静态常量,和当前 App 实际生效的系统 UI 样式没有关联,且 Flutter 的 SystemChrome 类未开放直接读取当前生效样式的公开 API,因此无法直接通过读取属性拿到当前值。
可行实现方案
方案1:全局状态手动维护(推荐)
这是成本最低、跨平台兼容最好的方案,只需要在每次修改系统 UI 样式时同步存储当前值即可,示例代码如下:- 定义全局存储变量,可根据项目技术栈选用顶层变量、Provider、GetX 等存储方式,这里以顶层变量为例:
// 初始化默认样式为App的默认全局样式 SystemUiOverlayStyle currentSystemUiStyle = SystemUiOverlayStyle.light;- 封装统一的设置系统 UI 样式的方法,每次修改时同步更新存储值:
void setCustomSystemUiStyle(SystemUiOverlayStyle style) { currentSystemUiStyle = style; SystemChrome.setSystemUIOverlayStyle(style); } // 调用示例 setCustomSystemUiStyle(SystemUiOverlayStyle( statusBarColor: Colors.green, systemNavigationBarColor: Colors.purple, ));- 页面跳转返回时恢复样式,直接读取存储的旧值设置即可:
// 跳转前保存当前样式 final oldStyle = currentSystemUiStyle; Navigator.push(context, MaterialPageRoute(builder: (_) => NextPage())) .then((_) { // 页面返回后恢复原有样式 setCustomSystemUiStyle(oldStyle); });方案2:路由自动监听恢复
如果不想每次跳转都手动写恢复逻辑,可以通过WidgetsBindingObserver或者路由观察者(RouteObserver)自动监听路由的 push/pop 事件,自动存储和恢复样式,适合页面跳转逻辑复杂的项目。方案3:原生平台通道读取(仅Android适用)
如果确实需要读取系统层面当前实际生效的样式,可以通过 MethodChannel 调用 Android 原生 API 获取:- Flutter 端发起调用请求
- Android 端通过
window.statusBarColor和window.navigationBarColor获取对应颜色值返回
该方案仅支持 Android 平台,iOS 无公开API可读取对应属性,实现复杂度高,非特殊需求不推荐使用。
内容的提问来源于stack exchange,提问作者Adriano Dias
相关产品推荐
相关产品推荐

