我使用过
Expanded
和 Flexible
小部件,它们的工作原理似乎相同。
扩展和灵活有什么区别?
Expanded
只是 Flexible
的简写
这样使用
Expanded
:
Expanded(
child: Foo(),
);
严格等同于:
Flexible(
fit: FlexFit.tight,
child: Foo(),
);
当您想要不同的
Flexible
时,您可能需要使用 Expanded
而不是 fit
,这在某些响应式布局中很有用。
FlexFit.tight
和FlexFit.loose
之间的区别在于,loose
将允许其子级具有最大尺寸,而tight
则强制该子级填充所有可用空间。
Flexible
下的小部件默认为WRAP_CONTENT,尽管您可以使用参数
fit
更改它。
Expanded
下的小部件是
MATCH_PARENT,您可以使用
flex
更改它。Expanded
-
Flexible
具有固定配合class Expanded extends Flexible {
const Expanded({
Key key,
int flex = 1,
@required Widget child,
}) : super(
key: key,
flex: flex,
fit: FlexFit.tight,
child: child
);
}
Flexible (fit: FlexFit.tight) = Expanded()
但是,Flexible 默认使用 fit :FlexFit.loose
。
FlexFit.tight= 希望紧密贴合父母,占用尽可能多的空间。
FlexFit.loose= 希望宽松地适合父母,占用尽可能少的空间。
默认将共享父窗口小部件的可用空间,但不会强制子窗口适应空间。 Expanded
将共享父窗口小部件的可用空间,并强制子窗口小部件更改其宽度/高度以填充可用空间。
事实上,Expanded
Flexible
,这是一个带有
Flexible
的
FlexFit.tight
。请参阅官方文档
。这里有一个
Container
小部件和三个连续的 Flexible
小部件 (
flex = 1, fit = FlexFit.loose
)。我们可以看到,三个灵活的小部件共享相同的
maxWidth
(可用屏幕宽度的1/3),蓝色的小部件想要比它大,而其他小部件想要比它小。但正如我们所看到的,蓝色家伙的宽度为
maxWidth
,而其他小部件的宽度正好适合其内容。
Row(
mainAxisSize: MainAxisSize.max,
children: [
Container(
color: Colors.teal,
child: Text(
'Container Text ',
)),
Flexible(
child: Container(
color: Colors.blue,
child: Text(' Text.Flexible Text.Flexible Text.Flexible.')),
),
Flexible(
child: Container(
color: Colors.yellow, child: Text('Flexible Text.')),
),
Flexible(
child: Container(
color: Colors.lightGreen, child: Text('Flexible.')),
),
],
)
flutter中的Expanded widget是Flexible的简写,默认适配为FlexFit.tight。灵活的小部件在制作响应式应用程序中发挥着非常重要的作用。这将使应用程序在多种设备尺寸上看起来和感觉都相同。但如果您只想通过小部件基本填充空间,那么您可以使用 Expanded。
Scaffold(
body: Column(
children: [
Flexible(
child: Container(
color: Colors.grey,
child: ListView.builder(
shrinkWrap: true,
itemCount: 6,
itemBuilder: (context,index){
return ListTile(title: Text('$index'),);
}),
),
)
],
),
)
灵活的将占用尽可能多的空间,而扩展将占用尽可能多的空间..要查看差异,请用扩展小部件替换灵活..它将占据所有可能的空间...
Flutter Expanded 与 Flexible 之间的区别: