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:
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:
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:
A menos que se indique lo contrario, la documentación de este sitio refleja Flutter 3.44.0. Página actualizada por última vez el 2026-05-05. Ver código fuente oreportar un problema.