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

Flutter:如何根据当前主题(深色/浅色)更改状态栏和导航栏颜色

在Flutter中实现主题切换时自动更改状态栏和导航栏颜色的最简方法

核心思路

利用Flutter内置的ThemeData配置浅色/深色主题对应的系统栏样式,让主题切换时自动同步状态栏和导航栏的颜色,无需额外监听主题变化。

步骤1:定义带系统栏样式的主题

在ThemeData的appBarTheme中配置systemOverlayStyle,分别设置浅色和深色主题下的状态栏、导航栏颜色及图标亮度:

// 浅色主题
final lightTheme = ThemeData(
  brightness: Brightness.light,
  appBarTheme: const AppBarTheme(
    systemOverlayStyle: SystemUiOverlayStyle(
      // 浅色主题下状态栏文字/图标为深色
      statusBarIconBrightness: Brightness.dark,
      // 状态栏背景色(可选,默认继承AppBar颜色)
      statusBarColor: Colors.white,
      // Android导航栏背景色
      systemNavigationBarColor: Colors.white,
      // Android导航栏图标颜色
      systemNavigationBarIconBrightness: Brightness.dark,
    ),
  ),
  // 其他浅色主题配置(如颜色Scheme、文本样式等)
);

// 深色主题
final darkTheme = ThemeData(
  brightness: Brightness.dark,
  appBarTheme: const AppBarTheme(
    systemOverlayStyle: SystemUiOverlayStyle(
      // 深色主题下状态栏文字/图标为浅色
      statusBarIconBrightness: Brightness.light,
      statusBarColor: Colors.black,
      systemNavigationBarColor: Colors.black,
      systemNavigationBarIconBrightness: Brightness.light,
    ),
  ),
  // 其他深色主题配置
);

步骤2:在MaterialApp中应用主题

将定义好的主题传入MaterialApp,并设置themeMode控制主题切换逻辑(跟随系统/固定浅色/固定深色):

MaterialApp(
  title: 'Theme Switch Demo',
  theme: lightTheme,
  darkTheme: darkTheme,
  // 跟随系统主题切换,可改为ThemeMode.light或ThemeMode.dark固定主题
  themeMode: ThemeMode.system,
  home: const HomePage(),
);

无AppBar页面的处理

如果页面没有使用AppBar,可以在页面的build方法中根据当前主题亮度动态设置系统栏样式:

@override
Widget build(BuildContext context) {
  final isDarkMode = Theme.of(context).brightness == Brightness.dark;
  
  // 动态设置系统栏样式
  SystemChrome.setSystemUIOverlayStyle(
    SystemUiOverlayStyle(
      statusBarIconBrightness: isDarkMode ? Brightness.light : Brightness.dark,
      statusBarColor: isDarkMode ? Colors.black : Colors.white,
      systemNavigationBarColor: isDarkMode ? Colors.black : Colors.white,
      systemNavigationBarIconBrightness: isDarkMode ? Brightness.light : Brightness.dark,
    ),
  );

  return Scaffold(
    body: Center(
      child: // 页面内容
    ),
  );
}

说明

  • 这种方法完全依赖Flutter的主题系统,无需额外添加第三方包,是最简洁的实现方式。
  • systemOverlayStyle中的属性可根据需求调整,比如不需要自定义状态栏背景色时,可省略statusBarColor,让其继承页面背景或AppBar颜色。

内容的提问来源于stack exchange,提问作者Rahul Biswas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 03:06:30