跳至主要内容

RenderBox 的干布局支持

摘要

#

RenderBox 协议中添加了一个名为 computeDryLayout 的新方法。RenderBox 的子类需要实现它,以便在内在计算期间根据一组 BoxConstraints 正确报告其所需大小。实现 computeDryLayout 的子类不再需要重写 performResize

上下文

#

RenderBox 协议中添加了一个新的方法 computeDryLayout,用于正确计算具有 WidgetSpan 子元素和 RenderWrapRenderParagraph 的内在大小。该方法接收一组 BoxConstraints,并期望计算 RenderBox 的结果大小,而无需更改任何内部状态。它本质上是 performLayout 的一个干运行,只计算结果大小,而不放置子元素。computeDryLayout 方法是内在协议的一部分(另请参见 RenderBox.computeMinIntrinsicWidth 及其相关方法)。

变更描述

#

如果 RenderBox 的子类用作可能查询其子元素内在大小的 RenderObject 的后代,则需要重写新的 computeDryLayout 方法。使用此功能的小部件示例包括 IntrinsicHeightIntrinsicWidth

RenderBox.performResize 的默认实现也使用 computeDryLayout 计算的大小来执行调整大小。因此,不再需要重写 performResize

迁移指南

#

已经重写 performResize 的子类可以通过简单地将函数签名从 void performResize() 更改为 Size computeDryLayout(BoxConstraints constraints) 并在返回计算出的尺寸而不是将其分配给 size 设置器来进行迁移。可以删除 performResize 的旧实现。

迁移前代码

dart
  @override
  void performResize() {
     size = constraints.biggest;
  }

迁移后代码

dart
  // 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 的大小取决于其子元素的基线度量,则无法计算干布局。

dart
  @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 文档

相关问题

相关 PR