flutter Stack 组件的底层布局算法是怎么样的?   2022-03-23


flutter 组件中, Stack 组件的使用频率还是很高的, Stack 组件的作用是实现层叠布局, 配合 Positions 组件和 Align 组件, 将实现子组件绝对定位.
那么, 它是如何决定子组件的摆放位置的呢? 这个算法是由 RenderStack 类来决定, 下面是布局算法的过程:

1) 初始化:

未定位的子组件, 会按照列表顺序放置在其他子组件的上面, 未定位的组件是指 top, left, right, bottom 为 null 的组件, 他们初始化时会被放置为 Stack 组件的左上角。

2) 确定 Stack 组件的大小

Stack 组件接着调整自身大小, 以包括所有未定位的子组件, 如果没有未定位的子组件, Stack 将会尽可能的大。

3) 确定子组件的 left 值和 top 值

未定位子组件的最终位置将由 alignment 参数来决定。 每一个未定位子组件的 left 值将会不同, 它在子组件的 width 值和 Stack 的 width 值之间由 alignment.x 缩放来决定。 同样的, top 值也是由 alignment.y 值缩放来决定. 请注意: 0.0 是 x, y 值的默认值, 将位于左上角, 0.5 将会位于中间位置.

4) 确定子组件的宽高

计算子组件的确切位置。 如果子组件的 top 值和 bottom 值不为 null, 它将获得固定的高度, 高度的计算方式是 Stack 的高度减去子组件的 top 值和 bottom 值, 同样的, 子组件的宽度也是有 Stack 的宽度, 以及自身的 left, right 值来决定. 如果子组件无法获得确切的宽高, 它将没有边界约束.

5) 确定子组件的位置

Stack 根据子组件的 StackParentData 的 top, right, bottom, left 的属性值来确定子组件的摆放位置。 举个例子, 如果 bottom 值是 10.0, 将会在 Stack 组件的底部和子组件的底部之间插入 10.0 像素。 如果子组件超出 Stack 的边界, 子组件将会被裁剪。


分享到:


  如果您觉得这篇文章对您的学习很有帮助, 请您也分享它, 让它能再次帮助到更多的需要学习的人. 您的支持将鼓励我继续创作 !
本文基于署名4.0国际许可协议发布,转载请保留本文署名和文章链接。 如您有任何授权方面的协商,请邮件联系我。

Contents

  1. 1) 初始化:
  2. 2) 确定 Stack 组件的大小
  3. 3) 确定子组件的 left 值和 top 值
  4. 4) 确定子组件的宽高
  5. 5) 确定子组件的位置