Column(
children: [
Text('Title'),
name != ''
? Text(name) //show name
: null // just pass a null we will filter it in next line!
].where((e) => e != null).toList()// Filter list and make it List again!
)
class MyWidget extends StatelessWidget {
final String name = 'Default';
final bool hasThing = true;
MyWidget({this.name});
MyWidget.withoutThing({this.name}) : hasThing = false;
@override
Widget build(BuildContext context) {
//define widgets they have in common here (as many as possible)
if (hasThing) {
return Widget(child: Thing(this.name));
} else {
return Widget(child: WithoutThing(this.name));
}
}
}
使用方法:
Center(child: MyWidget.withoutThing(name: 'Foo'),)//don't show thing
9条答案
按热度按时间7qhs6swi1#
对于像我这样想知道什么是“正确的方式”来显示一个空的小部件的人来说,官方的Material代码库使用了这样的方法:
SizedBox.shrink()
是一个与Container
或Material
不同的小部件,它没有背景或任何装饰。如果不受父约束的影响,它会将自己的大小调整到尽可能小的区域。cnh2zyt32#
您也可以直接返回一个空的
Container
,完全避免使用Scaffold
。但是如果这是您应用中唯一的主部件,这会导致黑屏。如果您想防止黑屏,可以设置Container
的color
属性。示例:
8wigbo563#
有很多可能的解决方案。比如
1.
sirbozc54#
性能
容器= 166,173毫秒
尺寸箱收缩= 164,523毫秒
自己动手
epfja78i5#
这可能太晚了,但所有这些解决方案都不适合某些场景,如玩
PopupMenuItems
或影响UI渲染!空安全更新
解决方案是在传递给呈现组件之前删除null项:
这样,我们可以有很多null,UI不会受到任何空
Widget
影响。PopupMenuButton
示例***无法传递SizedBox***:这可以用作
extension
的API:qvtsj1bj6#
当构建函数返回null时,flutter的错误消息是:
构建函数绝不能返回null。要返回使构建小部件填满可用空间的空白空间,请返回“new Container()"。要返回占用尽可能少空间的空白空间,请返回“new Container(width:0.0,高度:0.0)"的值。
sbtkgmzw7#
建议使用
SizedBox
来显示任何内容。rjjhvcjd8#
我的问题非常相似,但我发现
Container
和SizedBox.shrink
仍然影响UI(令人沮丧)。我得到的最好的解决方案是使用一个命名的构造函数和初始化器列表来构建它。
使用方法:
或
根据您的需求。
有关初始值设定项列表的详细信息:Colon after Constructor in dart
ztyzrc3y9#
在
Column
内部,我正在使用SizedBox(height: 0.01)