RenderBox 的干式布局支持
概述
#在 RenderBox 协议中新增了一个名为 computeDryLayout 的方法。RenderBox 的子类需要实现该方法,以便在内在计算时,根据给定的 BoxConstraints 正确报告其期望的大小。实现 computeDryLayout 的子类不再需要重写 performResize。
背景
#在 RenderBox 协议中新增了一个名为 computeDryLayout 的方法,用于正确计算带有 WidgetSpan 子项的 RenderParagraph 和 RenderWrap 的内在尺寸。该方法接收一组 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 必须在 assert 块内调用 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 文档
RenderBoxcomputeMinInstrinsicWidthcomputeDryLayoutgetDryLayoutperformResizeRenderWrapRenderParagraph
相关问题
相关 PR