跳至主要内容

ParentDataWidget 的泛型类型已更改为 ParentData

概要

#

ParentDataWidget 的泛型类型已从 RenderObjectWidget 更改为 ParentData

上下文

#

在此更改之前,ParentDataWidget 绑定到特定 RenderObjectWidget 类型作为祖先。例如,Positioned 组件只能在 Stack 组件内使用。通过此更改,只要所述 RenderObjectWidgetRenderObject 设置了正确的 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

迁移前的代码

dart
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 {
  // ...
}

迁移后的代码

dart
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)更改为 FrogJarParentDataFrogSize.applyParentData 要操作的 ParentData 类型)。此外,为该 ParentDataWidget 子类实现了新的 debugTypicalAncestorWidgetClass。它返回此 ParentDataWidget 的典型祖先 RenderObjectWidget 的类型。大多数情况下,您只需在此处返回旧的泛型类型(在此示例中为 FrogJar)。

时间线

#

合并版本:1.16.3
稳定版发布:1.17

参考

#

API 文档

相关 PR