跳至主要內容

ParentDataWidget 的泛型類型已變更為 ParentData

摘要

#

ParentDataWidget 的泛型類型已從 RenderObjectWidget 變更為 ParentData

背景

#

在此變更之前,ParentDataWidget 會繫結至特定的 RenderObjectWidget 類型作為祖先。例如,Positioned Widget 只能在 Stack Widget 內使用。在此變更之後,ParentDataWidget 可以與任何 RenderObjectWidget 類型作為祖先搭配使用,只要該 RenderObjectWidgetRenderObject 設定正確的 ParentData 類型即可。在這個新的世界中,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) 變更為 FrogJarParentData (ParentData 型別,FrogSize.applyParentData 希望在其上操作)。此外,這個 ParentDataWidget 子類別實作了新的 debugTypicalAncestorWidgetClass。它會回傳此 ParentDataWidget 的典型祖先 RenderObjectWidget 的型別。大多數情況下,您只需要在這裡回傳舊的泛型型別 (在此範例中為 FrogJar)。

時間軸

#

已於版本中推出:1.16.3
穩定版本:1.17

參考資料

#

API 文件

相關 PR