flutterAppBar之SystemUiOverlayStyle源码解析(一)

在 Flutter 中,SystemUiOverlayStyle 是用来控制系统 UI 元素(比如状态栏和导航栏)的外观的。通过它,你可以定制状态栏的颜色、图标亮度,导航栏的外观等。

Brightness

ruby 复制代码
/// 描述主题或色彩调色板的对比度。
enum Brightness {
  /// 颜色较深,通常需要使用浅色文本才能达到良好的可读对比度。
  ///
  /// 例如,颜色可能是深灰色,需要使用白色文本。
  dark,

  /// 颜色较浅,通常需要使用深色文本才能达到良好的可读对比度。
  ///
  /// 例如,颜色可能是明亮的白色,需要使用黑色文本。
  light,
}

SystemUiOverlayStyle

kotlin 复制代码
/// 指定系统覆盖层样式的首选项。
///
/// 通过 [AppBar.systemOverlayStyle] 声明性地设置系统覆盖层的样式,
/// 通过 [SystemChrome.setSystemUIOverlayStyle] 命令式地设置系统覆盖层的样式。
@immutable
class SystemUiOverlayStyle {
  /// 创建一个新的 [SystemUiOverlayStyle] 实例。
  const SystemUiOverlayStyle({
    this.systemNavigationBarColor, // 底部导航栏颜色
    this.systemNavigationBarDividerColor, // 底部导航栏分隔线颜色
    this.systemNavigationBarIconBrightness, // 导航栏图标亮度
    this.systemNavigationBarContrastEnforced, // 是否强制执行导航栏对比度
    this.statusBarColor, // 状态栏颜色
    this.statusBarBrightness, // 状态栏亮度
    this.statusBarIconBrightness, // 状态栏图标亮度
    this.systemStatusBarContrastEnforced, // 是否强制执行状态栏对比度
  });
}

systemNavigationBarColor、systemNavigationBarDividerColor、systemNavigationBarIconBrightness、systemNavigationBarContrastEnforced

arduino 复制代码
/// 系统底部导航栏的颜色。
///
/// 仅在 Android O 及更高版本中生效。
final Color? systemNavigationBarColor;

/// 系统底部导航栏和应用内容之间的分隔线颜色。
///
/// 仅在 Android P 及更高版本中生效。
final Color? systemNavigationBarDividerColor;

/// 系统导航栏图标的亮度。
///
/// 仅在 Android O 及更高版本中生效。
/// 当设置为 [Brightness.light] 时,系统导航栏图标为浅色。
/// 当设置为 [Brightness.dark] 时,系统导航栏图标为深色。
final Brightness? systemNavigationBarIconBrightness;

/// 在设置透明导航栏时覆盖对比度强制执行。
///
/// 在 SDK 29+ 或 Android 10 及更高版本中设置透明导航栏时,
/// 可能会在按钮导航栏后面应用一个半透明的背景遮罩,
/// 以确保与按钮和应用背景之间的对比度。
///
/// SDK 28- 或 Android P 及更低版本不会应用这个背景遮罩。
///
/// 将此设置为 false 将覆盖默认的背景遮罩。
///
/// 另请参阅:
///
///   * [SystemUiOverlayStyle.systemNavigationBarColor],在透明导航栏时,
///     此设置会覆盖默认的对比度策略。
final bool? systemNavigationBarContrastEnforced;

statusBarColor

arduino 复制代码
/// 顶部状态栏的颜色。
///
/// 仅在 Android M 及更高版本中生效。
final Color? statusBarColor;
  • statusBarColor:用于设置顶部状态栏的颜色。该属性仅在 Android M(Android 6.0)及更高版本中生效。

statusBarBrightness

arduino 复制代码
/// 顶部状态栏的亮度。
///
/// 仅在 iOS 中生效。
final Brightness? statusBarBrightness;

statusBarIconBrightness

arduino 复制代码
/// 顶部状态栏图标的亮度。
///
/// 仅在 Android M 及更高版本中生效。
final Brightness? statusBarIconBrightness;
  • statusBarIconBrightness :用于设置顶部状态栏图标的亮度。该属性仅在 Android M(Android 6.0)及更高版本中生效。Brightness.light 表示浅色图标,Brightness.dark 表示深色图标。

systemStatusBarContrastEnforced

arduino 复制代码
/// 在设置透明状态栏时覆盖对比度强制执行。
///
/// 在 SDK 29+ 或 Android 10 及更高版本中设置透明状态栏时,
/// 可能会应用一个半透明的背景遮罩,以确保图标与应用背景之间的对比度。
///
/// 在 SDK 28- 或 Android P 及更低版本中,不会应用这个背景遮罩。
///
/// 将此设置为 false 将覆盖默认的背景遮罩。
///
/// 另请参阅:
///
///   * [SystemUiOverlayStyle.statusBarColor],在透明状态栏时,
///     此设置会覆盖默认的对比度策略。
final bool? systemStatusBarContrastEnforced;

systemStatusBarContrastEnforced:用于在设置透明状态栏时,是否强制应用对比度遮罩。这个属性可以确保状态栏图标和背景之间有足够的对比度,以提高可读性。

  • 在 Android 10 及更高版本(SDK 29+)中,如果设置透明状态栏,会自动应用半透明背景遮罩。
  • 在 Android P 及更低版本中不会应用背景遮罩。
  • 将此属性设置为 false 可以禁用这种对比度增强策略,使用默认行为。

light

less 复制代码
/// 系统覆盖层应使用浅色绘制,适用于背景为深色的应用程序。
/// 该样式适用于需要浅色图标和深色背景的场景,例如深色背景的应用。
static const SystemUiOverlayStyle light = SystemUiOverlayStyle(
  // 设置底部导航栏的背景颜色为黑色
  systemNavigationBarColor: Color(0xFF000000),
  
  // 设置底部导航栏图标的亮度为浅色(适合黑色背景)
  systemNavigationBarIconBrightness: Brightness.light,
  
  // 设置顶部状态栏图标的亮度为浅色(适合深色背景)
  statusBarIconBrightness: Brightness.light, 
  
  // 设置顶部状态栏背景颜色为深色,以便浅色图标更加突出
  statusBarBrightness: Brightness.dark,
);

dark

less 复制代码
/// 系统覆盖层应使用深色绘制,适用于背景为浅色的应用程序。
/// 该样式适用于需要深色图标和浅色背景的场景,例如浅色背景的应用。
static const SystemUiOverlayStyle dark = SystemUiOverlayStyle(
  // 设置底部导航栏的背景颜色为黑色
  systemNavigationBarColor: Color(0xFF000000),
  
  // 设置底部导航栏图标的亮度为浅色(适合黑色背景)
  systemNavigationBarIconBrightness: Brightness.light,
  
  // 设置顶部状态栏图标的亮度为深色(适合浅色背景)
  statusBarIconBrightness: Brightness.dark, 
  
  // 设置顶部状态栏背景颜色为浅色,以便深色图标更加突出
  statusBarBrightness: Brightness.light,
);
相关推荐
橙序员小站6 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名8 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫9 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊9 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter9 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折9 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_9 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial9 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu10 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端
jiayu10 小时前
Angular6学习笔记13:HTTP(3)
前端