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