Flutter 中的 widget 由在其底层的
RenderBox 对象渲染而成。渲染框由其父级 widget 给出约束，并根据这些约束调整自身尺寸大小。约束是由最小宽度、最大宽度、最小高度、最大高度四个方面构成；尺寸大小则由特定的宽度和高度两个方面构成。
In Flutter, widgets are rendered by their underlying
RenderBox objects. Render boxes are given
constraints by their parent, and size themselves within those
constraints. Constraints consist of minimum and maximum widths
and heights; sizes consist of a specific width and height.
Generally, there are three kinds of boxes, in terms of how they handle their constraints:
Some widgets, for example
vary from type to type based on their constructor arguments.
In the case of
Container, it defaults
to trying to be as big as possible, but if you give it a
for instance, it tries to honor that and be that particular size.
Others, for example
Row and (flex boxes)
vary based on the constraints they are given,
as described below in the “Flex” section.
约束有时是”紧密的”，这意味着这些约束严格地限定了渲染框在定夺自身尺寸方面的空间（例如：当约束的最小宽度和最大宽度相同时，这种情况下，我们称这个约束有紧密宽度），这方面的主要例子是 App Widget，它是
RenderView 类里面的一个 widget:
build 函数返回的子 widget 渲染框被指定了一个约束，该约束强制 App Widget 精确填充应用程序的内容区域(通常是整个屏幕)。
Flutter 中的许多渲染框，特别是那些只包含单个 widget 的渲染框，都会将自身的约束传递给他们的子级 widget。这意味着如果你在应用程序渲染树的根部嵌套了一些渲染框，这些框将会在受到约束的影响下相互适应彼此。
The constraints are sometimes “tight”,
meaning that they leave no room for the render box to decide on
a size (for example, if the minimum and maximum width are the same,
it is said to have a tight width). An example of this is the
App widget, which is contained by the
class: the box used by the child returned by the
build function is given a constraint
that forces it to exactly fill the application’s content area
(typically, the entire screen).
Many of the boxes in Flutter, especially those that just take a
single child, pass their constraint on to their children.
This means that if you nest a bunch of boxes inside each other
at the root of your application’s render tree,
they’ll all exactly fit in each other, forced by these tight constraints.
Some boxes loosen the constraints,
meaning the maximum is maintained but the
minimum is removed. For example,
在某些情况下，传递给框的约束是 无边界 的或无限的。这意味着约束的最大宽度或最大高度为
In certain situations, the constraint that is given to a box is
unbounded, or infinite. This means that either the maximum width or
the maximum height is set to
当传递无边界约束给类型为尽可能大的框时会失效，在 debug 模式下，则会抛出异常，该异常信息会把你引导到本页面。
A box that tries to be as big as possible won’t function usefully when given an unbounded constraint and, in debug mode, such a combination throws an exception that points to this file.
tries to expand to fit the space available
in its cross-direction (for example,
if it’s a vertically-scrolling block,
it tries to be as wide as its parent).
If you nest a vertically scrolling
inside a horizontally scrolling
the inner one tries to be as wide as possible,
which is infinitely wide,
since the outer one is scrollable in that direction.
In bounded constraints, they try to be as big as possible in that direction.
在无边界约束条件下，它们试图让其子 widget 自适应这个给定的方向。在这种情况下，不能将子 widget 的
flex属性设置为 0（默认值）以外的任何值。这意味着在 widget 库中，当一个 flex 框嵌套在另外一个 flex 框或者嵌套在可滚动区域内时，不能使用
In unbounded constraints,
they try to fit their children in that direction.
In this case, you cannot set
flex on the children to
anything other than 0.
In the widget library, this means that you cannot use
Expanded when the flex box is inside
another flex box or inside a scrollable. If you do,
you’ll get an exception message pointing you at this document.
In the cross direction, for example, in the width for
Column (vertical flex) or in the height for
Row (horizontal flex), they must never be unbounded,
otherwise they would not be able to reasonably align their children.