ParentDataWidget 的泛型类型已更改为 ParentData
概要
#ParentDataWidget
的泛型类型已从 RenderObjectWidget
更改为 ParentData
。
上下文
#在此更改之前,ParentDataWidget
绑定到特定 RenderObjectWidget
类型作为祖先。例如,Positioned
组件只能在 Stack
组件内使用。通过此更改,只要所述 RenderObjectWidget
的 RenderObject
设置了正确的 ParentData
类型,ParentDataWidget
就可以与任何 RenderObjectWidget
类型作为祖先一起使用。在这个新世界中,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
。它返回此 ParentDataWidget
的典型祖先 RenderObjectWidget
的类型。大多数情况下,您只需在此处返回旧的泛型类型(在此示例中为 FrogJar
)。
时间线
#合并版本:1.16.3
稳定版发布:1.17
参考
#API 文档
相关 PR
除非另有说明,否则本网站上的文档反映了 Flutter 的最新稳定版本。页面最后更新于 2024-04-04。 查看源代码 或 报告问题。