ParentDataWidget 的泛型已更改为 ParentData。

概述

ParentDataWidget 的泛型已由 RenderObjectWidget 更改为 ParentData

上下文

在此次更改之前,ParentDataWidget 是作为祖先节点被绑定至特定的 RenderObjectWidget 类型的。例如:Positioned 部件只能在 Stack 部件中使用。通过此次更改,只要上述 RenderObjectWidgetRenderObject 设置了正确的 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)更改为 FrogJarParentDataFrogSize.applyParentData 所操作的 ParentData 类型)。除此之外,子类 ParentDataWidget 实现了新的 debugTypicalAncestorWidgetClass。它给 ParentDataWidget 返回了一个典型的 RenderObjectWidget 类型的祖先节点。大多数时候,您只是想在此处返回旧的泛型(在这个示例中就是 FrogJar)。

时间轴

发布于版本:1.16.3
发布于稳定版本:1.17

参考文献

API 文档:

相关 PR: