Saltar al contenido principal

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:

dart
  @override
  void performResize() {
     size = constraints.biggest;
  }

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

dart
  // 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.

dart
  @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:

Issues relevantes:

PRs relevantes: