目 录CONTENT

文章目录

Flutter 布局控件篇-->Stack、Positioned

FanJunyang
2023-03-08 / 0 评论 / 0 点赞 / 503 阅读 / 0 字
温馨提示:
本文最后更新于2024-08-14,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
广告 广告

文章已同步至掘金:https://juejin.cn/post/6844903956955545607
欢迎访问😃,有任何问题都可留言评论哦~

Flutter 中的层叠布局,相当于Web中的绝对定位,也是相当重要的一部分。

他允许子组件可以根据距父容器四个角的位置来确定自身的位置。绝对定位允许子组件堆叠起来(按照代码中声明的顺序)。

Flutter 中使用StackPositioned这两个组件来配合实现绝对定位。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)或部分定位的子组件。
所谓部分定位,在这里特指没有在某一个轴上定位:leftright为横轴,topbottom为纵轴,只要包含某个轴上的一个定位属性就算在该轴上有定位。

textDirection

Row、的textDirection功能一样,都用于确定alignment对齐的参考系。

即:textDirection的值为TextDirection.ltr,则alignmentstart代表左,end代表右,即从左往右的顺序;textDirection的值为TextDirection.rtl,则alignmentstart代表右,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

指定需要定位元素的宽度和高度。

注:Positionedwidthheight和其它地方的意义稍微有点区别,此处用于配合lefttoprightbottom来定位组件,

举例说明:
在水平方向时,你只能指定leftrightwidth三个属性中的两个,如指定leftwidth后,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"),
	)
  ],
);

运行效果:

flutter-stack-positioned-1


M_M

0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin
  3. PayPal/U

    PayPal https://paypal.me/junyangfan
    BTC
    (Bitcoin)
    USDT
    (TRC20)
广告 广告

评论区