ParentDataWidget 的泛型已更改为 ParentData。
概述
ParentDataWidget
的泛型已由 RenderObjectWidget
更改为 ParentData
。
上下文
在此次更改之前,ParentDataWidget
是作为祖先节点被绑定至特定的 RenderObjectWidget
类型的。例如:Positioned
部件只能在 Stack
部件中使用。通过此次更改,只要上述 RenderObjectWidget
的 RenderObject
设置了正确的 ParentData
类型,
ParentDataWidget
就可以作为任意 RenderObjectWidget
类型的祖先节点和其一起使用。通过这种新的方式,Positioned
部件就可以通过假想的 SuperStack
新部件而被重用了。
更改描述
ParentDataWidget
的泛型参数已由 RenderObjectWidget
更改为 ParentData
,并添加了一个新的调试属性 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: