在Flutter中,我已经遇到了好几次一个相当大的障碍。动画或构建小部件,这取决于其他小部件来获取它们的大小/位置。
以下是Flutter中可能是最糟糕的噩梦之一: 动态将小部件对齐到彼此旁边。 在CSS中,我们会有这个:
.root {
display: flex;
background: grey;
padding: 4px;
}
.root > div {
background: lightgrey;
margin-right: 5px;
padding: 5px;
}
<div class="root">
<div>
dynamic height
<br/>
dynamic width
<br/>
fat
<br/>
super fat
</div>
<div>
dynamic width
<br/>
dynamic height
</div>
</div>
- 父元素占据整个宽度(不重要)。
- 父元素高度为最高子元素的高度。
- 高度较小的子元素会被拉伸以适应父元素。
- 子元素紧邻着彼此定位。
在Flutter中,我认为我们无法同时拥有以上所有4个特点。
现在如果我们有两个包含这种布局的列表,并且有一个动画,其中一个元素从一个列表移到另一个列表,会怎样呢? 例如:
另一个例子。 如果我们想要一个 SlideTransition
与另一个没有共同点的部件垂直对齐呢?像这样:
这些都是完全随机的示例。 我不需要复制相同的东西。 真正的问题是:是否有一种通用方法可以进行类似的操作(获取屏幕大小/位置)? 这种方法将不会针对此用例而是易于维护吗?
IntrinsicHeight
。另一方面,对于我展示的动画,CustomChildLayout
不起作用。不仅 CustomChildLayout 的大小不能依赖于子元素;而且它仍然无法解决访问全局小部件的世界位置/大小的问题。 - Rémi RousseletMultiChildLayoutDelegate
,则在performLayout
中会向你提供widget的大小。您可以通过调用layoutChild
来确定子项的大小。如果您想获取renderObject
的全局坐标,则可以使用localToGlobal
,尽管如果您这样做,您可能会违反封装性,并且应该在更高级别上实现自定义布局。 - Collin JacksonLayoutBuilder
来获取包围小部件的大小约束。如果您正在实现MultiChildLayoutDelegate
,则不需要使用它。 - Collin JacksonperformLayout
中获取子级大小,但您将无法在getSize
内访问其大小。 - Rémi Rousselet