Soporte de dry layout para RenderBox
Se agregó el método "computeDryLayout" al protocolo RenderBox para calcular correctamente su tamaño intrínseco en ciertas situaciones.
Resumen
#Se agregó un nuevo método llamado computeDryLayout al protocolo RenderBox.
Se espera que las subclases de RenderBox lo implementen para informar correctamente
su tamaño deseado dado un conjunto de BoxConstraints durante los cálculos
intrínsecos. Las subclases que implementan computeDryLayout ya no necesitan
sobrescribir performResize.
Contexto
#Se agregó un nuevo método, computeDryLayout, al protocolo RenderBox para
calcular correctamente los tamaños intrínsecos de un RenderParagraph con hijos
WidgetSpan y un RenderWrap. El método recibe un conjunto de BoxConstraints
y
se espera que calcule el tamaño resultante del RenderBox sin cambiar
ningún estado (State) interno. Es esencialmente una ejecución de prueba (dry run) de performLayout que solo
calcula el tamaño resultante y no coloca a los hijos. El
método computeDryLayout es parte del protocolo de características intrínsecas (consulta también
RenderBox.computeMinIntrinsicWidth
y relacionados).
Descripción del cambio
#Las subclases de RenderBox deben sobrescribir el nuevo método computeDryLayout
si se utilizan como descendientes de un RenderObject que pueda consultar el tamaño
intrínseco de sus hijos. Ejemplos de widgets que hacen esto son IntrinsicHeight
e IntrinsicWidth.
La implementación predeterminada de RenderBox.performResize también utiliza el tamaño
calculado por computeDryLayout para realizar el cambio de tamaño. Por lo tanto, sobrescribir performResize
ya no es necesario.
Guía de migración
#Las subclases que ya sobrescriben performResize se pueden migrar simplemente
cambiando la firma de la función de void performResize() a
Size computeDryLayout(BoxConstraints constraints) y devolviendo el
tamaño calculado en lugar de asignarlo al setter de size. La antigua
implementación de performResize se puede eliminar.
Código antes de la migración:
@override
void performResize() {
size = constraints.biggest;
}
Código después de la migración:
// This replaces the old performResize method.
@override
Size computeDryLayout(BoxConstraints constraints) {
return constraints.biggest;
}
Si la subclase no sobrescribe performResize, la implementación de
computeDryLayout debe extraerse del método performLayout.
Básicamente, computeDryLayout necesita hacer todo el trabajo que realiza performLayout
para determinar el tamaño del RenderBox. Sin embargo, en lugar de asignarlo
al setter de size, devuelve el tamaño calculado. Si computeDryLayout
necesita conocer el tamaño de sus hijos, debe obtener ese tamaño llamando a
getDryLayout en el hijo en lugar de llamar a layout.
Si por alguna razón es imposible calcular el dry layout, computeDryLayout
debe llamar a debugCannotComputeDryLayout dentro de un assert y devolver un tamaño ficticio
de const Size(0, 0). Calcular un dry layout es, por ejemplo, imposible
si el tamaño de un RenderBox depende de las métricas de línea de base (baseline) de sus hijos.
@override
Size computeDryLayout(BoxConstraints constraints) {
assert(debugCannotComputeDryLayout(
reason: 'Layout requires baseline metrics, which are only available after a full layout.'
));
return const Size(0, 0);
}
Timeline
#Llegó en la versión: 1.25.0-4.0.pre
En lanzamiento estable: 2.0.0
Referencias
#Documentación de la API:
RenderBox-
computeMinIntrinsicWidth -
computeDryLayout -
getDryLayout -
performResize -
RenderWrap -
RenderParagraph
Issues relevantes:
PRs relevantes:
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-11. Ver código fuente oreportar un problema.