ParentDataWidget 的泛型类型已更改为 ParentData
概述
#ParentDataWidget
的泛型类型已从 RenderObjectWidget
更改为 ParentData
。
背景
#在此更改之前,ParentDataWidget
作为祖先被绑定到特定的 RenderObjectWidget
类型。例如,Positioned
widget 只能在 Stack
widget 中使用。通过此更改,只要 RenderObjectWidget
的 RenderObject
设置了正确的 ParentData
类型,ParentDataWidget
就可以与任何 RenderObjectWidget
类型作为祖先一起使用。在这个新世界中,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
(FrogSize.applyParentData
想要操作的 ParentData
类型)。此外,此 ParentDataWidget
子类实现了新的 debugTypicalAncestorWidgetClass
。它返回此 ParentDataWidget
的典型祖先 RenderObjectWidget
的类型。大多数情况下,您只想在此处返回旧的泛型类型(此示例中的 FrogJar
)。
时间线
#发布版本: 1.16.3
稳定版本: 1.17
参考资料
#API 文档
相关 PR