RenderBox 的干布局支持
摘要
#在 RenderBox
协议中添加了一个名为 computeDryLayout
的新方法。RenderBox
的子类需要实现它,以便在内在计算期间根据一组 BoxConstraints
正确报告其所需大小。实现 computeDryLayout
的子类不再需要重写 performResize
。
上下文
#在 RenderBox
协议中添加了一个新的方法 computeDryLayout
,用于正确计算具有 WidgetSpan
子元素和 RenderWrap
的 RenderParagraph
的内在大小。该方法接收一组 BoxConstraints
,并期望计算 RenderBox
的结果大小,而无需更改任何内部状态。它本质上是 performLayout
的一个干运行,只计算结果大小,而不放置子元素。computeDryLayout
方法是内在协议的一部分(另请参见 RenderBox.computeMinIntrinsicWidth
及其相关方法)。
变更描述
#如果 RenderBox
的子类用作可能查询其子元素内在大小的 RenderObject
的后代,则需要重写新的 computeDryLayout
方法。使用此功能的小部件示例包括 IntrinsicHeight
和 IntrinsicWidth
。
RenderBox.performResize
的默认实现也使用 computeDryLayout
计算的大小来执行调整大小。因此,不再需要重写 performResize
。
迁移指南
#已经重写 performResize
的子类可以通过简单地将函数签名从 void performResize()
更改为 Size computeDryLayout(BoxConstraints constraints)
并在返回计算出的尺寸而不是将其分配给 size
设置器来进行迁移。可以删除 performResize
的旧实现。
迁移前代码
@override
void performResize() {
size = constraints.biggest;
}
迁移后代码
// This replaces the old performResize method.
@override
Size computeDryLayout(BoxConstraints constraints) {
return constraints.biggest;
}
如果子类没有重写 performResize
,则必须从 performLayout
方法中提取 computeDryLayout
的实现。基本上,computeDryLayout
需要完成 performLayout
为确定 RenderBox
大小所做的所有工作。但是,它不将其分配给 size
设置器,而是返回计算出的大小。如果 computeDryLayout
需要知道其子元素的大小,则必须通过在子元素上调用 getDryLayout
来获取该大小,而不是调用 layout
。
如果由于某种原因无法计算干布局,则 computeDryLayout
必须在断言中调用 debugCannotComputeDryLayout
并返回 const Size(0, 0)
的虚拟大小。例如,如果 RenderBox
的大小取决于其子元素的基线度量,则无法计算干布局。
@override
Size computeDryLayout(BoxConstraints constraints) {
assert(debugCannotComputeDryLayout(
reason: 'Layout requires baseline metrics, which are only available after a full layout.'
));
return const Size(0, 0);
}
时间线
#包含于版本:1.25.0-4.0.pre
稳定版发布:2.0.0
参考文献
#API 文档
RenderBox
computeMinInstrinsicWidth
computeDryLayout
getDryLayout
performResize
RenderWrap
RenderParagraph
相关问题
相关 PR
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面最后更新于 2024-04-04。 查看源代码 或 报告问题.