在Android中,每个单独的View子类都有一个setVisibility()方法,允许你修改View对象的可见性

有3个设置可见性的选项:

可见:在布局中显示视图 不可见:隐藏视图,但留下一个空白,相当于视图在可见时所占据的空白 消失:隐藏视图,并将其完全从布局中移除。就好像它的高和宽都是0dp

对于Flutter中的小部件,是否有与上述相同的东西?

快速参考: https://developer.android.com/reference/android/view/View.html#attr_android:visibility


当前回答

更新:因为这个答案是写的,可见性被引入,并提供了这个问题的最佳解决方案。


你可以在不透明度:为0.0的情况下使用不透明度来绘制隐藏的元素,但仍然占用空间。

为了使它不占用空间,将其替换为空Container()。

编辑: 要将它包装在不透明对象中,请执行以下操作:

            new Opacity(opacity: 0.0, child: new Padding(
              padding: const EdgeInsets.only(
                left: 16.0,
              ),
              child: new Icon(pencil, color: CupertinoColors.activeBlue),
            ))

谷歌开发者不透明度快速教程:https://youtu.be/9hltevOHQBw

其他回答

更新:因为这个答案是写的,可见性被引入,并提供了这个问题的最佳解决方案。


你可以在不透明度:为0.0的情况下使用不透明度来绘制隐藏的元素,但仍然占用空间。

为了使它不占用空间,将其替换为空Container()。

编辑: 要将它包装在不透明对象中,请执行以下操作:

            new Opacity(opacity: 0.0, child: new Padding(
              padding: const EdgeInsets.only(
                left: 16.0,
              ),
              child: new Icon(pencil, color: CupertinoColors.activeBlue),
            ))

谷歌开发者不透明度快速教程:https://youtu.be/9hltevOHQBw

更新

Flutter现在有一个可见性小部件。要实现您自己的解决方案,请从下面的代码开始。


自己做一个小部件。

显示/隐藏

class ShowWhen extends StatelessWidget {
  final Widget child;
  final bool condition;
  ShowWhen({this.child, this.condition});

  @override
  Widget build(BuildContext context) {
    return Opacity(opacity: this.condition ? 1.0 : 0.0, child: this.child);
  }
}

显示/删除

class RenderWhen extends StatelessWidget {
  final Widget child;
  final bool condition;
  RenderWhen({this.child, this.show});

  @override
  Widget build(BuildContext context) {
    return this.condition ? this.child : Container();
  }
}

顺便问一下,有没有人对上面的小部件有更好的名字?

更多的阅读

关于如何制作可见性小部件的文章。

尝试Offstage小部件

如果属性off - stage:true则不占用物理空间且不可见,

如果属性offstage:false它将占用物理空间而可见

Offstage(
   offstage: true,
   child: Text("Visible"),
),

在Flutter中有很多不同的方法来实现这一点。在我解释它们之前,我将首先提供与android原生“隐形”和“消失”等价的快速解决方案:

视图。看不见的:

Opacity(
  opacity: 0.0,
  child: ...
)

视图。了:

Offstage(
  child: ...
)

现在让我们比较一下这些方法和其他方法:

不透明度

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

后台

这个小部件隐藏了子小部件。你可以把它想象成把小部件放在“屏幕外面”,这样用户就看不到它了。小部件仍然要完成颤振管道中的所有内容,直到它到达最后的“绘制”阶段,在这个阶段它根本不绘制任何东西。这意味着它将维护所有的状态和动画,但不会在屏幕上呈现任何东西。此外,它在布局时也不会占用任何空间,不会留下任何空隙,用户自然无法点击。

可见性

这个小部件结合了上述(以及更多)功能,方便您使用。它有参数,如maintainState, maintainAnimation, maintainSize, maintainInteractivity等。根据你设置这些属性的方式,它由以下决定:

if you want to maintain state, it will either wrap the child with an Opacity or with an Offstage, depends on whether you also want to maintain size. Further, unless you want to maintainInteractivity, it will also wrap an IgnorePointer for you, because clicking on a transparent button is kinda weird. if you don't want to maintainState at all, it directly replaces the child with a SizedBox so it's completely gone. You can change the blank SizedBox to anything you want, with the replacement property.

删除小部件

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

你可以在你的代码中用一个叫做(Visibility)的新小部件封装任何小部件,这是你想让它不可见的小部件最左边的黄色灯

例如:假设你想让一行不可见:

Click in the lamp and choose (Wrap with widget) Rename the widget to Visibility Add the visible property and set it to false The Child of the newly created widget (Visibility Widget) is the Widget that you want it to be invisible Visibility( visible: false, child: Row( crossAxisAlignment: CrossAxisAlignment.start, children: <Widget>[ SizedBox( width: 10, ), Text("Search", style: TextStyle(fontSize: 20 ),), ], ), ),

我希望它能在将来帮助到别人