概述

#

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

背景

#

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

迁移前的代码

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