本节目标
- Stack
- IndexedStack
- Positioned
Stack 和 IndexStack 都是层叠布局方式,类似于 Android 里的 FrameLayout 帧布局,内部子元素是有层级堆起来的。
Stack 继承自 MultiChildRenderObjectWidget,Stack 也是多子元素的一个组件之一(内部可以包含多个子元素)。
而 IndexedStack 继承自 Stack,扩展了 Stack 的一些特性。它的作用是显示第 index 个子元素,其他子元素都是不可见的。所以 IndexedStack 的尺寸永远是跟最大的子元素尺寸一致。
Stack 的布局行为,是根据子元素是 positioned 还是 non-positioned 来区分的:
对于 positioned 的子元素,它们的位置会根据所设置的 top、bottom、right 或 left 属性来确定,这几个值都是相对于 Stack 的左上角;
对于 non-positioned 的子元素,它们会根据 Stack 的 aligment 来设置位置。
Stack 布局的子元素层级堆叠顺序:最先布局绘制的子元素在最底层,越后绘制的越在顶层。类似于 Web 中的 z-index。
Stack
1 2 3 4 5 6 7 8 9 10 11 12 13
| Stack({ Key key, this.alignment = AlignmentDirectional.topStart, this.textDirection, this.fit = StackFit.loose, this.overflow = Overflow.clip, List<Widget> children = const <Widget>[], })
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| static const Alignment topLeft = Alignment(-1.0, -1.0);
static const Alignment topCenter = Alignment(0.0, -1.0);
static const Alignment topRight = Alignment(1.0, -1.0);
static const Alignment centerLeft = Alignment(-1.0, 0.0);
static const Alignment center = Alignment(0.0, 0.0);
static const Alignment centerRight = Alignment(1.0, 0.0);
static const Alignment bottomLeft = Alignment(-1.0, 1.0);
static const Alignment bottomCenter = Alignment(0.0, 1.0);
static const Alignment bottomRight = Alignment(1.0, 1.0);
|
1 2 3 4 5 6 7 8 9 10
| enum StackFit { loose,
expand,
passthrough, }
|
1 2 3 4 5 6 7
| enum Overflow { visible,
clip, }
|
IndexedStack
1 2 3 4 5 6 7 8 9 10
| IndexedStack({ Key key, AlignmentGeometry alignment = AlignmentDirectional.topStart, TextDirection textDirection, StackFit sizing = StackFit.loose, this.index = 0, List<Widget> children = const <Widget>[], })
|
Positioned
1 2 3 4 5 6 7 8 9 10
| const Positioned({ Key key, this.left, this.top, this.right, this.bottom, this.width, this.height, @required Widget child, })
|
代码
https://github.com/ducafecat/flutter-learn/tree/master/state_less_ful_app
参考
© 猫哥
https://ducafecat.tech
邮箱 ducafecat@gmail.com / 微信 ducafecat / 留言板 disqus