ParentDataWidget 的泛型型別已更改為 ParentData
概述
#ParentDataWidget 的泛型型別已從 RenderObjectWidget 更改為 ParentData。
背景
#在此更改之前,ParentDataWidget 與特定的 RenderObjectWidget 型別作為祖先繫結。例如,Positioned 小部件只能在 Stack 小部件內使用。透過此更改,ParentDataWidget 可以與任何 RenderObjectWidget 型別作為祖先一起使用,只要該 RenderObjectWidget 的 RenderObject 設定了正確的 ParentData 型別。在這種新模式下,Positioned 小部件可以與假設的 SuperStack 小部件重複使用。
變更說明
#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 (FrogSize.applyParentData 希望操作的 ParentData 型別)。此外,為這個 ParentDataWidget 子類實現了新的 debugTypicalAncestorWidgetClass。它返回一個典型的祖先 RenderObjectWidget 型別,供此 ParentDataWidget 使用。在大多數情況下,您只需要在此處返回舊的泛型型別 (在本例中為 FrogJar)。
時間線
#釋出版本: 1.16.3
穩定版本: 1.17
參考資料
#API 文件
相關 PR