Saltar al contenido principal

El tipo genérico de ParentDataWidget cambió a ParentData

El ParentDataWidget ahora está vinculado al tipo ParentData.

Resumen

#

El tipo genérico de ParentDataWidget ha cambiado de RenderObjectWidget a ParentData.

Contexto

#

Antes de este cambio, un ParentDataWidget estaba vinculado a un tipo específico de RenderObjectWidget como ancestro. Por ejemplo, un Widget Positioned solo se podía usar dentro de un Widget Stack. Con este cambio, un ParentDataWidget se puede usar con cualquier tipo de RenderObjectWidget como ancestro, siempre que el RenderObject de dicho RenderObjectWidget configure el tipo de ParentData correcto. En este nuevo mundo, el Widget Positioned se puede reutilizar con un hipotético nuevo Widget SuperStack.

Descripción del cambio

#

El argumento de tipo genérico de ParentDataWidget ha cambiado de RenderObjectWidget a ParentData, y se añade una nueva propiedad de depuración, debugTypicalAncestorWidgetClass, a ParentDataWidget. Esta última se utiliza para los mensajes de error para dar a los usuarios una mejor idea del contexto en el que se supone que se debe usar un ParentDataWidget dado.

Guía de migración

#

Debes migrar tu código como se describe en esta sección si estás heredando o implementando ParentDataWidget. Si lo haces, el analizador muestra las siguientes advertencias cuando actualices a la versión de Flutter que incluye este cambio:

  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

Código antes de la migración:

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

Código después de la migración:

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
}

El tipo genérico de la superclase ParentDataWidget cambia de FrogJar (un RenderObjectWidget) a FrogJarParentData (el tipo de ParentData en el que FrogSize.applyParentData quiere operar). Además, se implementa el nuevo debugTypicalAncestorWidgetClass para esta subclase de ParentDataWidget. Devuelve el tipo de un RenderObjectWidget ancestro típico para este ParentDataWidget. La mayoría de las veces, solo querrás devolver el tipo genérico antiguo aquí (FrogJar en este ejemplo).

Timeline

#

Lanzado en la versión: 1.16.3
En versión estable: 1.17

Referencias

#

Documentación de la API:

PR relevante: