Visibility vs Offstage vs Opacity,哪个最能将孩子隐藏在小部件树中?

iDe*_*ode 7 flutter

这个线程我发现有很多方法可以从树层次结构中隐藏小部件。喜欢使用:

Visibility

Visibility(
  visible: false,
  child: Foo(),
);
Run Code Online (Sandbox Code Playgroud)

Offstage

Offstage(
  offstage: true,
  child: Foo(),
);
Run Code Online (Sandbox Code Playgroud)

Opacity

Opacity(
  opacity: 0,
  child: Foo(),
);
Run Code Online (Sandbox Code Playgroud)

if 健康)状况:

if (visible) {
  child
}
Run Code Online (Sandbox Code Playgroud)

什么不是。

他们中的哪一个是首选(我知道Visibility是那个,为什么Visibility),if条件和之间有什么区别Visibility,我如何衡量性能。Opacity文档提到:

不透明度比按需从树中添加和删除子小部件更有效。

那是什么意思,是为了if条件吗?如果是,if那么在这四个中处于什么位置?

use*_*613 7

不透明度

这个将不透明度 (alpha) 设置为您想要的任何内容。将其设置为0.0比将其设置为 稍微不那么明显0.1,所以希望这很容易理解。小部件仍将保持其大小并占据相同的空间,并保持每个状态,包括动画。由于它留下了间隙,用户仍然可以触摸它或单击它。(顺便说一句,如果你不想让人们触摸一个不可见的按钮,你可以用一个IgnorePointer小部件包装它。)

台下

这个隐藏了子小部件。您可以将其想象为将小部件放在“屏幕之外”,这样用户就不会看到它。小部件仍会遍历颤振管道中的所有内容,直到到达最终的“绘制”阶段,在此阶段它根本不绘制任何内容。这意味着它将保持所有状态和动画,但不会在屏幕上呈现任何内容。此外,它在布局时也不会占用任何空间,不留空隙,用户自然无法点击。

能见度

为了您的方便,这个结合了上述(以及更多)。它具有一些参数,如maintainStatemaintainAnimationmaintainSizemaintainInteractivity等取决于你如何设置这些属性,从以下决定:

  1. 如果你想保持状态,它会用 anOpacity或 an包裹孩子,这Offstage取决于你是否也想保持大小。此外,除非你想maintainInteractivity,它也会IgnorePointer为你包装 an ,因为点击透明按钮有点奇怪。

  2. 如果你根本不想maintainState,它直接child用 a代替,SizedBox所以它完全消失了。您可以SizedBox使用replacement属性将空白更改为您想要的任何内容。

删除小部件

如果您不需要维护状态等,通常建议从树中完全删除小部件。例如,您可以使用if (condition)来决定是否将小部件包含在列表中,或者使用直接condition ? child : SizedBox()将其替换为SizedBox。这避免了不必要的计算,并且对性能来说是最好的。

  • 这个答案确实澄清了我关于具有“If”条件并添加“SizedBox()”作为树中所需小部件的替代方案的想法。 (3认同)