Tratar con restricciones de cajas

En Flutter, los widgets son dibujados por su objeto RenderBox subyacente. Las cajas de renderizado boxes toman las restricciones dadas por sus padres, y se dimensioan a si mismos con estas restricciones. Las restricciones consisten en anchos y altos míbimos y máximos; las dimensiones consisten en un acho y alto específicos.

Generalmente, hay tres tipos de cajas, en términos de como manejan sus restricciones:

  • Aquellas que tratan de ser tan grandes como sea posible. Por ejemplo, las cajas usadas por Center y ListView.
  • Aquellas que tratan de ser del mismo tamaño de sus hijos. Por ejemplo, las cajas usadas por Transform y Opacity.
  • Aquellas que tratan de ser de unas dimensiones concretas. Por ejemplo, las cajas usadas por Image y Text.

Algunos widgets, por ejemplo Container, varian de tipo basándose en los argumentos de su constructor. En el caso de Container, por defecto trata de ser tan grande como sea posible, pero si le proporcionas un width, por ejemplo, este trata de cumplir con esto y tener un tamaño concreto.

Otros, por ejemplo Row y Column (cajas flexibles) varían basándose en las restricciones que se le proporcionen, como se describe abajao en la sección “Flex”.

Las restricciones son algunas veces “forzadas”, significando esto que estas no dejan espacio al Renderbox para decidir un tamaño (e.j. si el mínimo y el máximo ancho son el mismo, a esto se le llama tener un ancho forzado). El principal ejemplo de esto es el widget App, el cual es contenido por la clase RenderView: la caja usada por el hijo devuelto por la funcion build de la aplicación toma una restricción que le fuerzaa llenar exactamente el area de contenido de la aplicación (normalmente, la pantalla completa). Muchas de las cajas en Flutter, especialmente aquellas que toman un solo hijo, pasan sus restricciones a sus hijos. Esto significa que si anidas un manojo de cajas dentro de otras en la raiz del árbol de renderizado de tu aplicación, todos encajaran exactamente en los otros, obligados por estas restricciones forzadas.

Algunas cajas aflojan sus restricciones, esto significa que se mantiene el máximo pero se elimina el mínimo. Por ejemplo, Center.

Restricciones ilimitadas

En ciestas situaciones, la restricción que toma una caja es ilimitada, o infinita. Esto significa que ya sea el ancho máximo o la altura máxima están fijadas a double.INFINITY.

Una caja que trata de ser lo más grande posible no funcionará convenientemente cuando se le da una restricción ilimitada y, en modo de depuración, tal combinación lanzará un aexcepción que apunta a este docuemnto.

El caso más común una caja de renderizado se encuentra con restricciones ilimitadas son las cajas flexibles (Row y Column), y dentro de las regiones con scroll (ListView y otras subclases de ScrollView).

En particular, ListView trata de expandirse para llenar el espacio disponible en su cross-direction (ej. si es un block de scroll vertical, este trata de ser tan ancho como su padre). Si anidas un ListView de scroll vertical dentro de un ListView, de scroll horizontal, el interno trata de ser tan ancho como sea posible, lo cual es ancho infinito, ya que el otro tiene scroll en esta dirección.

Flex

Las cajas flexibles en si mismas, (Row y Column) se conforman de forma diferente dependiendo de si tienen restricciones limitadas o ilimitadas en su dirección dada.

Con restricciones limitadas, estos tratan de ser tan grandes como sea posible en esta dirección.

Con restricciones ilimitadas, estos tratan de ajustarse a sus hijos en esta dirección. En este caso, no puedes fijar la propiedad flex en los hijos en ora cosa que no sea 0 (su valor por defecto). En la biblioteca de widgets, esto significa que no puedes usar Expanded cuando la caja flexible esta dentro de otra caja flexible o dentro de una caja con scroll. Si lo haces, onbtendrás un mensaje de excepción remitiéndote a este documento.

En la dirección cruzada, ej. en su ancho para un Column (flex vertical) y en su alto para un Row (flex horizontal), nunca debern ser ilimitados, sino podrían no alinear razonablemente sus hijos.