前言:
这是我参与8月更文挑战的第 24 天,活动详情查看:8月更文挑战。为应掘金的八月更文挑战,我准备在本月挑选 31 个以前没有介绍过的组件,进行全面分析和属性介绍。这些文章将来会作为 Flutter 组件集录 的重要素材。希望可以坚持下去,你的支持将是我最大的动力~
1.认识 Positioned 组件
Positioned 组件一般只用于 Stack 组件中,源码中对它的介绍是:一个可以控制 Stack 子组件位置的组件。

下面是 Positioned 组件类的定义和 构造方法,可以看出它继承自 ParentDataWidget<StackParentData> 。有 左上右下宽 高六个属性。通过断言可以看出 左右宽 不可同时为 null, 上下高 不可同时为 null。且 child 参数是必须传入的。

之前介绍的 Flexible 也 ParentDataWidget 类型的组件,它只能用于 Flex 组件中。可以看出 ParentDataWidget 可以限定组件的使用范围。
2. Positioned 组件的使用
我们可以通过 左上右下 控制子组件相对于 Stack 组件区域的偏移量,这些数值可为负数。当超越 Stack 区域后,如果想要显示,需要设置 clipBehavior: Clip.none ,否则出界的将会被裁剪。

class PositionedDemo extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
color: Colors.grey.withAlpha(33),
constraints: BoxConstraints.tightFor(width: 200, height: 150),
child: Stack(
clipBehavior: Clip.none,
children: <Widget>[
Container(width: 100, height:100,color: Colors.red),
Positioned(
left: -12,
top: -12,
child: Icon(Icons.ac_unit, color: Colors.black)),
Positioned(
bottom: 20,
right: 10,
child: Icon(Icons.ac_unit, color: Colors.green))
],
),
);
}
}
复制代码
至于宽高,是用于确定 Positioned 的尺寸大小,如下将绿色图标对应的 Positioned 宽高设置为 120*150 。可见,偏移量是根据 Positioned 的尺寸区域进行偏移的。

class PositionedDemo extends StatelessWidget {
... 略同
Positioned(
bottom: 20,
right: 10,
width: 120,
height: 150,
child: Icon(Icons.ac_unit, color: Colors.green))
],
复制代码
3.Positioned 组件的下的约束特性
下面的案例中,通过 Positioned 组件嵌套绿色,红色不嵌套,且它们都没有高度。想一下,红色 Container 是否可以显示?绿色 Container 是否可以显示?

结果可以看出,红色被拉伸填充,绿色不显示。其中有着怎样的科学道理呢?

可以看出,包裹 Positioned 组件后,由于 Container 未指定高度,高度没有约束。

未包裹 Positioned 组件的 Container ,会受到 Stack 的约束。

通过 LayoutBuilder 可以查看一下 Positioned 组件下的约束情况,如下,可以看出, Positioned 组件下是无约束的,这也是 Container 未指定高度,高度为 0 的根本原因。

3. Positioned 组件只能用在 Stack 中吗?
如果 Positioned 用在别处,就会出现如下的异常:

严格意义上来说,Positioned 并不是只能用在 Stack 组件内。决定Positioned 组件可以用在 Stack 组件下的本质原因是 RenderStack 混入了 ContainerRenderObjectMixin<RenderBox, StackParentData> 。

也就是说,如果别的渲染对象混入了 ContainerRenderObjectMixin<RenderBox, StackParentData> ,其内部也是可以用 Positioned 组件的。比如 _RenderTheatre ,这个渲染对象对应的组件是 _Theatre。用于 Overlay 组件中。

也就是说在 Overlay 组件中,我们也可以使用 Positioned 组件进行定位。那本文到这里就结束了,谢谢观看,明天见~




















![[02/27][官改] Simplicity@MIX2 ROM更新-一一网](https://www.proyy.com/wp-content/uploads/2020/02/3168457341.jpg)



![[桜井宁宁]COS和泉纱雾超可爱写真福利集-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/4d3cf227a85d7e79f5d6b4efb6bde3e8.jpg)
![[桜井宁宁] 爆乳奶牛少女cos写真-一一网](https://www.proyy.com/skycj/data/images/2020-12-13/d40483e126fcf567894e89c65eaca655.jpg)
