文章已同步至掘金:https://juejin.cn/post/6844903956955545607
欢迎访问😃,有任何问题都可留言评论哦~
Flutter 中的层叠布局,相当于Web中的绝对定位,也是相当重要的一部分。
他允许子组件可以根据距父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。
Flutter 中使用Stack
和Positioned
这两个组件来配合实现绝对定位。Stack
允许子组件堆叠,而Positioned
用于根据Stack
的四个角来确定子组件的位置。
Stack
允许子组件进行堆叠,就是一层一层的摞起来,和Web中一样
源码示例
构造函数如下:
Stack({
Key key,
this.alignment = AlignmentDirectional.topStart,
this.textDirection,
this.fit = StackFit.loose,
this.overflow = Overflow.clip,
List<Widget> children = const <Widget>[],
})
属性解释
alignment
此属性决定如何去对齐没有定位(没有使用Positioned
)或部分定位的子组件。
所谓部分定位,在这里特指没有在某一个轴上定位:left
、right
为横轴,top
、bottom
为纵轴,只要包含某个轴上的一个定位属性就算在该轴上有定位。
textDirection
和Row
、的textDirection
功能一样,都用于确定alignment
对齐的参考系。
即:textDirection
的值为TextDirection.ltr
,则alignment
的start
代表左,end
代表右,即从左往右的顺序;textDirection
的值为TextDirection.rtl
,则alignment
的start
代表右,end
代表左,即从右往左的顺序。
fit
用于确定没有定位的子组件如何去适应Stack
的大小。
StackFit.loose
表示使用子组件的大小;
StackFit.expand
表示扩伸到Stack
的大小。
overflow
此属性决定如何显示超出Stack
显示空间的子组件;
Overflow.clip
表示超出部分会被剪裁(隐藏);
Overflow.visible
表示不会被剪裁。
至于使用方法,最后会给出一个例子
Positioned
绝对定位,用于确定子组件的位置
源码示例
构造函数如下:
const Positioned({
Key key,
this.left,
this.top,
this.right,
this.bottom,
this.width,
this.height,
@required Widget child,
})
属性解释
left、top、right、bottom
他们分别代表离Stack
左、上、右、下四边的距离。
width、height
指定需要定位元素的宽度和高度。
注:Positioned
的width
、height
和其它地方的意义稍微有点区别,此处用于配合left
、top
、right
、 bottom
来定位组件,
举例说明:
在水平方向时,你只能指定left
、right
、width
三个属性中的两个,如指定left
和width
后,right
会自动算出(left
+width
),如果同时指定三个属性则会报错,垂直方向同理。
代码示例:
Stack(
fit: StackFit.expand, //扩伸到Stack的大小。
alignment: Alignment.center, //指定未定位或部分定位widget的对齐方式
children: <Widget>[
Container(
child: Text("xxxxxx", style: TextStyle(color: Colors.white)),
color: Colors.pink,
),
Positioned(
left: 15.0,
top: 30.0,
child: Text("yyyyyy"),
),
Positioned(
top: 15.0,
child: Text("zzzzzz"),
)
],
);
运行效果:
评论区