本系列教程基于Flutter widget, 意在为Flutter 入门提供基础建设. 重点在讲解widget 的 用法,参数以及扩展.
适宜人群: 入门

引言

如果你想要隐藏 Widget , 那么 Visibility 应该是 Flutter 中最为有效的控件之一了. 本文将向你介绍它的用法和原理.

用法

Visibility 参数包括 replacement、visible、maintainState、maintainAnimation、maintainSize、maintainSemantics、maintainInteractivity .
image

visible 与 replacement

实际使用中, 最多的是 visible . 当为 false 时, 即隐藏当前 widget , 显示 replacement . 而为 true 时, 则显示当前 widget. 在其他参数不变时, visible 与 replacement 的关系就像是精灵宝可梦.

image
根据 visiable 的属性决定是用 child 还是 replacement 显示在屏幕上. 值得一提的是, 这时切换 visable 会销毁不在屏幕上的那部分 widget . 而如果你想维持状态的话, 则需要用到下文提到的 maintainState 一类的属性了.

maintain(*)

  • maintainState 用于维护小部件不可见时的 state 不被销毁
  • maintainAnimation 在小部件不可见时仍然维护小部件的动画
  • maintainSize 用于小部件不可见时保留小部件的尺寸
  • maintainSemantics 用于小部件不可见时维护语义
  • maintainInteractivity 用于小部件不可见时维护小部件的可交互性

这里, 本文也整理了一下关于 maintain(*) 属性的一些强要求, 比如说当某些属性为 true 时, 会同时需要其他属性也为 true.

属性 属性为true时条件 属性为false时条件
maintainState maintainAnimation必须为false
maintainAnimation maintainSize 必须为false
maintainSize maintainAnimation、maintainState必须为true maintainSemantics、maintainInteractivity必须为false
maintainSemantics maintainSize必须为true
maintainInteractivity maintainSize必须为true

之所以这么设计呢~ 在涉及 maintain(*) 属性中, 都涉及到了其他的小部件的使用, 例如 maintainSize 中使用到了 Opacity , 而 maintainState 中则使用了 Offstage .所以当涉及此类 api 时, 会有额外的性能损耗.

原理

默认情况下, Visibility 可以隐藏 widget 是借助了 setState 方法, 刷新当前 widget 树, 替换节点的方法不再占位. 当我们需要 保持小部件尺寸或者维持状态时, 则是通过其他组件的协助.

2022121202.png
从 Visibility 的用法中, 我们可以学到单一职责在实际开发中的运用还是很多的. 我们可以相互叠加达到 1+1>2 的效果, 但是运用中也要注意性能损耗. 非必要情况还是不维护已隐藏的 widget!

结语

这里是WeninerIo😇

如果你对这次的技术分享感兴趣或者有什么疑惑🧐

不妨在评论区留言或私信🤪

或许这次的分享不是你所期待的😣

那就点个关注吧! ❤️

下次也许就是你想看的呢🫣?