在 Flutter 项目中,SafeArea 是一个用于确保内容不被设备屏幕的切口(如刘海屏、状态栏、导航栏等)遮挡的布局组件。它自动计算屏幕的安全区域,并调整子 Widget 的位置,使其避开系统 UI 元素。


何时使用 SafeArea

1. 避开状态栏和刘海屏

📌 适用场景:

  • 在 全屏页面 或 沉浸式模式 下,避免内容被 状态栏(Status Bar) 或 刘海屏(Notch) 遮挡。

  • 适用于 iOS 设备(iPhone X 及以上)和 Android 设备(部分厂商的刘海屏或挖孔屏)。

✅ 示例:

dart

Scaffold(
  body: SafeArea(
    child: Text("这段文字不会被刘海屏或状态栏遮挡"),
  ),
)

2. 避开底部导航栏(Bottom Navigation Bar)

📌 适用场景:

  • 在 Android 设备 上,避免内容被 底部导航栏(Navigation Bar) 遮挡。

  • 在 iOS 设备 上,避免内容被 Home Indicator(底部横条) 遮挡。

✅ 示例:

dart

Scaffold(
  body: SafeArea(
    bottom: true, // 默认 true,确保底部安全
    child: Text("这段文字不会被底部导航栏遮挡"),
  ),
)

3. 适配不同设备(如折叠屏、平板)

📌 适用场景:

  • 在 折叠屏设备(如 Samsung Galaxy Fold) 或 平板 上,确保内容在展开/折叠时仍然可见。

  • 适用于 横屏/竖屏切换 时,防止内容被系统 UI 遮挡。

✅ 示例:

dart

Scaffold(
  body: SafeArea(
    left: true,   // 适配左侧安全区域(如横屏模式)
    right: true,  // 适配右侧安全区域
    child: Text("适配折叠屏/平板的安全区域"),
  ),
)

4. 在 Scaffold 之外使用

📌 适用场景:

  • 如果页面没有使用 Scaffold(如自定义全屏页面),但仍需避开系统 UI。

  • 适用于 游戏界面、自定义全屏弹窗 等场景。

✅ 示例:

dart

MaterialApp(
  home: SafeArea(
    child: MyCustomFullScreenWidget(),
  ),
)

什么时候可以不用 SafeArea

❌ 不需要 SafeArea 的情况:

  1. 页面已经有 AppBarAppBar 默认会避开状态栏)。

  2. 页面使用 Scaffold 且没有全屏需求Scaffold 默认会处理部分安全区域)。

  3. 内容本身不需要避开系统 UI(如背景图片、全屏视频播放)。


SafeArea 的高级用法

1. 控制安全区域的方向

dart

SafeArea(
  top: true,     // 避开顶部(默认 true)
  bottom: true,  // 避开底部(默认 true)
  left: false,   // 不避开左侧
  right: false,  // 不避开右侧
  child: Text("只避开顶部和底部"),
)

2. 结合 Padding 使用

dart

SafeArea(
  minimum: EdgeInsets.all(16), // 额外增加 16px 内边距
  child: Text("避开系统 UI 并增加额外内边距"),
)

总结

场景 是否推荐 SafeArea 备注
全屏页面(无 AppBar ✅ 推荐 防止被状态栏/刘海屏遮挡
底部内容(如按钮、输入框) ✅ 推荐 防止被底部导航栏遮挡
横屏/折叠屏适配 ✅ 推荐 防止左右两侧被遮挡
已有 AppBar 或 Scaffold ⚠️ 可选 AppBar 默认会处理顶部安全区
全屏视频/游戏 ❌ 不需要 内容可以覆盖系统 UI

最佳实践:

  • 默认在 Scaffold 的 body 中使用 SafeArea,除非有特殊需求。

  • 在自定义全屏 UI(如弹窗、引导页)时手动添加 SafeArea

这样可以让你的 Flutter 应用在各种设备上都能正确显示内容,避免 UI 被遮挡的问题。 🚀

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐