ParentDataWidget 的泛型類型已變更為 ParentData
摘要
#ParentDataWidget
的泛型類型已從 RenderObjectWidget
變更為 ParentData
。
背景
#在此變更之前,ParentDataWidget
會繫結至特定的 RenderObjectWidget
類型作為祖先。例如,Positioned
Widget 只能在 Stack
Widget 內使用。在此變更之後,ParentDataWidget
可以與任何 RenderObjectWidget
類型作為祖先搭配使用,只要該 RenderObjectWidget
的 RenderObject
設定正確的 ParentData
類型即可。在這個新的世界中,Positioned
Widget 可以與假設的新 SuperStack
Widget 重複使用。
變更說明
#ParentDataWidget
的泛型型別參數已從 RenderObjectWidget
變更為 ParentData
,並且為 ParentDataWidget
新增了一個除錯屬性 debugTypicalAncestorWidgetClass
。後者用於錯誤訊息,讓使用者更清楚了解給定的 ParentDataWidget
應該在什麼情況下使用。
移轉指南
#如果您正在子類別化或實作 ParentDataWidget
,則必須依照本節所述遷移您的程式碼。如果您這樣做,當您升級到包含此變更的 Flutter 版本時,分析器會顯示以下警告:
error • Missing concrete implementation of 'getter ParentDataWidget.debugTypicalAncestorWidgetClass' • lib/main.dart:114:7 • non_abstract_class_inherits_abstract_member
error • 'FrogJar' doesn't extend 'ParentData' • lib/main.dart:114:41 • type_argument_not_matching_bounds
遷移前的程式碼
class FrogSize extends ParentDataWidget<FrogJar> {
FrogSize({
Key key,
required this.size,
required Widget child,
}) : assert(child != null),
assert(size != null),
super(key: key, child: child);
final Size size;
@override
void applyParentData(RenderObject renderObject) {
final FrogJarParentData parentData = renderObject.parentData;
if (parentData.size != size) {
parentData.size = size;
final RenderFrogJar targetParent = renderObject.parent;
targetParent.markNeedsLayout();
}
}
}
class FrogJarParentData extends ParentData {
Size size;
}
class FrogJar extends RenderObjectWidget {
// ...
}
遷移後的程式碼
class FrogSize extends ParentDataWidget<FrogJarParentData> { // FrogJar changed to FrogJarParentData
FrogSize({
Key key,
required this.size,
required Widget child,
}) : assert(child != null),
assert(size != null),
super(key: key, child: child);
final Size size;
@override
void applyParentData(RenderObject renderObject) {
final FrogJarParentData parentData = renderObject.parentData;
if (parentData.size != size) {
parentData.size = size;
final RenderFrogJar targetParent = renderObject.parent;
targetParent.markNeedsLayout();
}
}
@override
Type get debugTypicalAncestorWidgetClass => FrogJar; // Newly added
}
ParentDataWidget
父類別的泛型型別從 FrogJar
(一個 RenderObjectWidget
) 變更為 FrogJarParentData
(ParentData
型別,FrogSize.applyParentData
希望在其上操作)。此外,這個 ParentDataWidget
子類別實作了新的 debugTypicalAncestorWidgetClass
。它會回傳此 ParentDataWidget
的典型祖先 RenderObjectWidget
的型別。大多數情況下,您只需要在這裡回傳舊的泛型型別 (在此範例中為 FrogJar
)。
時間軸
#已於版本中推出:1.16.3
穩定版本:1.17
參考資料
#API 文件
相關 PR
除非另有說明,否則本網站上的文件反映了 Flutter 的最新穩定版本。頁面最後更新於 2024-04-04。 檢視原始碼 或 回報問題。