在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
更新
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();
}
}
顺便问一下,有没有人对上面的小部件有更好的名字?
更多的阅读
关于如何制作可见性小部件的文章。
正如@CopsOnRoad已经强调的那样,
您可以使用Visibility小部件。但是,如果你想保持它的状态,例如,如果你想建立一个viewpager,让一个按钮根据页面出现和消失,你可以这样做
void checkVisibilityButton() {
setState(() {
isVisibileNextBtn = indexPage + 1 < pages.length;
});
}
Stack(children: <Widget>[
PageView.builder(
itemCount: pages.length,
onPageChanged: (index) {
indexPage = index;
checkVisibilityButton();
},
itemBuilder: (context, index) {
return pages[index];
},
controller: controller,
),
Container(
alignment: Alignment.bottomCenter,
child: Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
Visibility(
visible: isVisibileNextBtn,
child: "your widget"
)
],
),
)
]))
初学者也可以试试。
class Visibility extends StatefulWidget {
@override
_VisibilityState createState() => _VisibilityState();
}
class _VisibilityState extends State<Visibility> {
bool a = true;
String mText = "Press to hide";
@override
Widget build(BuildContext context) {
return new MaterialApp(
title: "Visibility",
home: new Scaffold(
body: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new RaisedButton(
onPressed: _visibilitymethod, child: new Text(mText),),
a == true ? new Container(
width: 300.0,
height: 300.0,
color: Colors.red,
) : new Container(),
],
)
),
);
}
void _visibilitymethod() {
setState(() {
if (a) {
a = false;
mText = "Press to show";
} else {
a = true;
mText = "Press to hide";
}
});
}
}