Row 组件
这两个组件可以用来进行做flex布局,row可以用来做水平方向的布局,column可以用来进行垂直方向上的布局,这两个类都是基于web的flex布局模式实现的。
Row
组件通常不会考虑到内部元素的滚动问题,如果Row中的子组件超过可用空间的大小,则会被视为一种错误。如果我们有几个组件,并且希望在空间不足的时候有个滚动效果,那么我们就可以考虑使用ListView
组件。
Row
组件类有这么几个属性:
children
:要进行布局的子组件。crossAxisAlignment
: 交叉轴对齐方式。mainAxisAlignment
: 主轴对齐方式。mainAxisSize
: 主轴上占用的空间。textDirection
: 控制子元素的排列方向。如果我们只有一个组件,在用Row
组件进行布局的时候,我们通常可以让它居中:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Text('出发~'),
]
),
);
}
当我们Row
组件中的内容超出它的空间时,屏幕上就会出现黄黑相间的条纹警示信息。
image.png
这时候我们可以把文本包裹在Expanded
组件中来解决这个问题:
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(),
body: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const Expanded(
child: Text(
'Flutters hot reload helps you quickly and easily experiment, build UIs, add features, and fix bug faster. Experience sub-second reload times, without losing state, on emulators, simulators, and hardware for iOS and Android.'),
)
]
),
);
}
crossAxisAlignment
,mainAxisAlignment
,mainAxisSize
,textDirection
这几个属性我们稍微用小拇指琢磨一下,其实他们都是枚举类型:
具体的值和css中的flex布局属性保持了一致。
Row
组件的布局分为六个步骤:
Flexible.fit
属性值为tight
的则强制填充分配的空间,Flexible.fit
属性值为loose
的,则不再强制填充分配的空间。mainAxisSize
属性为mainAxisSize.max
,则Row的宽度是传入约束的最大宽度。如果mainAxisSize
属性为mainAxisSize.min
,则Row的宽度是子对象的宽度之和。mainAxisAlignment
和crossAxisAlignation
确定每个子对象的位置。例如,如果mainAxisAlignment
是mainAxisAlignment.spaceBetween
,任何未分配给子对象的水平空间都将被平均分配并放置在子对象之间。Cloumn组件主要用来将子组件进行垂直方向上的布局。想要要使子组件展开以填充可用的垂直空间,我们可以将子组件包裹在Expanded
件中。
同样,Cloumn组件默认也不支持滚动,如果我们想要滚动的功能,那么我们还得考虑使用ListView
组件。
Cloumn组件上的属性和Row 组件上的属性基本一致,这里就不再多说了。
当传入的组件没有具体的垂直约束边界(高度)时,我们可能会遇到各种问题,比如:
我们不用Expanded
组件对Cloumn组件进行包裹,而Cloumn组件中的内容超出了容器本身的限制。
或者我们把Cloumn组件嵌入到了ListView
组件中。
image.png
这时候我们需要考虑组件内部的结构到底应该怎么布局,子组件的大小具体应该设置成什么?是否应该移除一些多余的内容等等。
Cloumn
组件的布局也分为六个步骤:
crossAxisAlignment
为crossAxisAlignment.stretch
,则使用与传入的最大宽度匹配的紧密水平约束。Flexible.fit
属性值为tight
则强制填充分配的空间),Flexible.fit
属性值为loose
的,则不再强制填充分配的空间。mainAxisSize
属性确定。如果mainAxisSize
属性为mainAxisSize.max
,则Column的高度为传入约束的最大高度。如果mainAxisSize
属性为mainAxisSize.min
,则Column的高度为子对象的高度之。mainAxisAlignment
和crossAxisAlignation
确定每个子对象的位置。例如,如果mainAxisAlignmen
t是mainAxisAlignment.spaceBetween
,任何未分配给子对象的垂直空间都将被均匀划分并放置在子对象之间。掌握了这些内容,就算是掌握了flutter的Cloumn组件 和 Row 组件。
本文分享自 JavaScript高级程序设计 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!