Flutter Visibility 和 Offstage 的区别

Flutter Visibility 和 Offstage 的区别

Visibility

dart 复制代码
//默认行为:隐藏,不占位,动画状态会被销毁,不保留 State
Visibility(
  visible: false,
  child: const MyWidget(),
)
//显式写出 replacement 配置
Visibility(
  visible: false,
  //replacement 默认就是 SizedBox.shrink()
  replacement: const SizedBox.shrink(),
  child: const MyWidget(),
)
//相当于就是 MyWidget 被默认的 SizedBox.shrink() 替换效果
//...
const SizedBox.shrink()
//...
//三元条件渲染(visible=false)
visible
    ? const MyWidget()
    : const SizedBox.shrink();

Visibility 的关键参数

dart 复制代码
//隐藏,不占位,动画状态会被销毁,不保留 State
Visibility(
  visible: false,
  child: const MyWidget(),
)
//就是
Visibility(
  visible: false,
  maintainState: false,
  maintainAnimation: false,
  maintainSize: false,
  child: const MyWidget(),
)

//依赖关系(只有设为 true 时才会触发依赖关系)
//maintainSize == true
  //→ maintainAnimation 必须为 true
    //→ maintainState 必须为 true

//隐藏但占位,动画仍在后台运行,保留 State
maintainSize: true  maintainAnimation: true  maintainState: true
//隐藏,不占位,动画仍在后台运行,保留 State
maintainSize: false  maintainAnimation: true  maintainState: true
//隐藏,不占位, 动画 ticker 暂停,进度停在当前值,保留 State
maintainSize: false  maintainAnimation: false  maintainState: true

Offstage 幕后

dart 复制代码
//隐藏,不占位,动画仍在后台运行,保留 State
Offstage(
  offstage: true,
  child: const MyWidget(),
)
//近似于(该状态下构建时底层就是返回了 Offstage)
Visibility(
  visible: false,
  maintainState: true,
  maintainAnimation: true,
  maintainSize: false,
  child: const MyWidget(),
)

总结

  • 完全移除组件(不保留状态):如骨架屏、空状态和列表切换;用 Visibility 的默认 参数或三元表达式,隐藏、不占位、State 销毁
  • 保留状态但暂停动画(节省资源):如临时隐藏的加载动画、轮播图、卡片动画或倒计时动画;用 maintainSize: false, maintainAnimation: false, maintainState: true,隐藏后 ticker 暂停,保留 State
  • 临时隐藏但保留状态:如 Tab 页面切换、多步骤表单前后切换、收起再展开的筛选面板;用 maintainSize: false, maintainAnimation: true, maintainState: true 或 Offstage(offstage: true),隐藏、不占位、保留 State
  • 隐藏但保留布局位置(避免 UI 跳动):如表单错误提示、按钮操作区;用 maintainSize: true, maintainAnimation: true, maintainState: true,隐藏但仍占位
相关推荐
程序员老刘13 小时前
跨平台开发地图 | 2026年10月
flutter·ai编程·客户端
林瞅瞅15 小时前
Flutter 开发环境从零搭建与调试记录
flutter
FungLeo19 小时前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存
FungLeo20 小时前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
穆梓兰煊2 天前
Flutter端云协同推理架构解析
flutter·github
FungLeo2 天前
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全
flutter·网络安全·移动开发·webview·路由管理·成为全栈
m0_738185822 天前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
FungLeo2 天前
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
m0_738185822 天前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙