当前位置: 首页 > 知识库问答 >
问题:

可见性与台下与不透明度,哪个是最好的从小部件树中隐藏孩子?

宋勇
2023-03-14

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

可见性

Visibility(
  visible: false,
  child: Foo(),
);

后台

Offstage(
  offstage: true,
  child: Foo(),
);

不透明度

Opacity(
  opacity: 0,
  child: Foo(),
);

如果条件:

if (visible) {
  child
}

还有什么不可以。

哪一个是首选(我知道< code>Visibility是那个,通过why < code>Visibility),< code > if 条件和< code > Visibility 有什么区别,我如何衡量性能。< code >不透明度文档提到:

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

这是什么意思,是针对if条件的吗?如果是,那么在四者中的位置在哪里?

共有2个答案

佘茂才
2023-03-14

我认为上述答案非常有用和明确。关于使用条件方法,我介绍了两种非常有用的方法:

条件 ? 子项 : SizeBox()if (条件) 子项,如果你使用 dart ver 至少 2.3.0

查看更多 https://github.com/flutter/flutter/issues/3783

太叔鸿博
2023-03-14

不透明度

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

台下

这个隐藏了子部件。你可以把它想象成把小部件放在“屏幕之外”,这样用户就看不到它了。小部件仍然会遍历flutter管道中的所有内容,直到到达渲染阶段,在这里它根本不会布局或绘制任何内容。这意味着它将保持所有的状态和动画,但只是不会在“布局阶段”占用任何空间,也不会在“绘画阶段”绘制任何东西。因为它没有留下任何空隙,所以用户自然不能点击它。

能见度

为了您的方便,这一款结合了上述(和更多)功能。它具有参数,如maintainStatemaitainAnimationmaintainSizemaitainInteractivity等。根据您如何设置这些属性,它从以下方面决定:

>

  • 如果您想维护状态,它将使用OpacyOffStage包装子级,这取决于您是否还想保持大小。此外,除非您想维护Interactive,否则它还会为您包装一个IgnorePointer,因为单击透明按钮有点奇怪。

    如果您根本不想维护状态,它会直接将替换为SizedBox,因此它完全消失了。您可以使用替换属性将空白SizedBox更改为您想要的任何内容。

    删除小部件

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

  •  类似资料:
    • 我有一个区域有很多对象,包括按钮等,可以点击。 动画不透明度工作很好,但我发现不可见的按钮仍然在画布的堆栈中,因此仍然可以点击。我想运行一个不透明动画,然后将项目设置为可见性隐藏,一旦它完成...这是可能的吗? 我的尝试产生了一个淡出的动画,但在淡出动画可以运行之前突然从页面上掉下来。 我基本上是在尽量避免画布上其他元素的干扰,但仍然保持在那里。 我得到了错误的行为,在项目消失之前,完全淡出,或者

    • 问题内容: 如果是这样,它是否有效地弃用了该property? 问题答案: 这是来自各种答案的经过验证的信息的汇总。 这些CSS属性实际上都是唯一的。除了使元素不可见之外,它们还具有以下附加效果: 折叠 元素通常会占用的空间 响应 事件 (例如,单击,按键) 在参与 的TabOrder

    • 问题内容: 是否可以编写和创建Firefox中的Firebug插件无法捕获的JavaScript Ajax请求? 我之所以这样询问,是因为我可以在Facebook上看到没有正在进行的Ajax请求,但是当我从另一个帐户发送消息时,顶部的消息框仍会添加“ 1条未读消息”指示符。甚至有可能实现? 谢谢。 问题答案: Firebug将“标准” AJAX请求记录到控制台面板;这些是使用ActiveX / X

    • 半透明三角形叠加.html源码效果如下如图所示。 渲染管线之融合 GPU的渲染管线有各种功能单元,比如前面讲到的深度测试侧单元,通过执行gl.enable(gl.DEPTH_TEST)语句可以开启GPU渲染管线的深度测试单元, 同样更改WebGL API gl.enable()的参数也可以指定开启其它的功能模块,参数gl.BLEND就表示渲染管线的α融合单元,α融合的英文是alpha blendi

    • 我正在使用内置的woocommerce类别小部件,目前它同时显示类别和子类别。 我通过以下代码排除了一个类别: 但是小部件仍然显示它的子类别。 链接:http://tithaty.com.br/?post_type=product 隐藏的类别是Coleções(我配置为父级),我想隐藏它的子类别,当前的和将来添加的子类别。 Colecao teste是一个子类别的例子。 有什么想法吗? 非常感谢。

    • 问题内容: 您如何在Tkinter中显示和隐藏小部件?我想有一个输入框,但不要一直显示它。有人可以向我展示在tkinter中显示和隐藏条目小部件和其他小部件的功能吗?我希望能够在没有多个帧的情况下执行此操作。 问题答案: 这已经在stackoverflow上得到了回答。简短的答案是,您可以使用grid_remove,如果先前是通过网格添加的,则将导致该小部件被删除。记住小部件的位置,因此只需简单地