概述

#

RenderBox 協議中新增了一個名為 computeDryLayout 的方法。RenderBox 的子類需要實現該方法,以便在內在計算時,根據給定的 BoxConstraints 正確報告其期望的大小。實現 computeDryLayout 的子類不再需要重寫 performResize

背景

#

RenderBox 協議中新增了一個名為 computeDryLayout 的方法,用於正確計算帶有 WidgetSpan 子項的 RenderParagraphRenderWrap 的內在尺寸。該方法接收一組 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 必須在 assert 塊內呼叫 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