Skip to main content

ParentDataWidget 的泛型型別變更為 ParentData

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)變更為 FrogJarParentDataFrogSize.applyParentData 希望操作的 ParentData 型別)。 此外,這個 ParentDataWidget 子類別也實作了新的 debugTypicalAncestorWidgetClass。 它會回傳此 ParentDataWidget 的典型祖先 RenderObjectWidget 的型別。 大多數情況下,你只需要在這裡回傳舊的泛型型別 (在此範例中為 FrogJar)。

時程

#

合併於版本:1.16.3
進入穩定版:1.17

參考資料

#

API 文件:

相關 PR: