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