古詩詞大全網 - 四字成語 - 2020-05-15 flutter BoxConstraints and layout

2020-05-15 flutter BoxConstraints and layout

在出現布局錯誤時能盡快找到錯誤原因。

以下是對關鍵內容的翻譯和註解。

flutter的布局模型是“壹步布局模型”(one-pass layout model),在渲染樹中,向下treewalk傳遞給子 盒約束,然後再向上treewalk將計算好的幾何形狀(比如高度、寬度等)傳遞給父。我理解one-pass layout model就是壹遍就將布局計算好。不會多次treewalk去計算布局,或多次重繪(repaint)並多次計算布局。

計算的好的幾何形狀必須符合盒約束的要求。

盒約束有四個值,minWidth,maxWidth,minHeight,maxHeight,符合盒約束的意思就是說 計算出的寬高必須在最大值和最小值之間

我猜測,在將盒約束向子傳遞的過程中,子會根據父的盒約束,設置自己的盒約束,而不是單純的繼承父的盒約束。稍後結合Flex布局可以解釋。

盒約束的最小值和最大值相等。因此在tight約束下的子的高寬將等於父的高寬,也就是說子是緊緊(tight)貼著父的。

盒約束的最小值為0,也就是說子可以是小於盒約束最大值的任何值,也就是說子是不緊貼(松的,loose)父的。

盒約束的最大值不是infinite(無窮大)

盒約束的最大值是infinite(無窮大)

盒約束的最小值是infinite(無窮大),他的子的寬或高只能取無窮大。

子的寬高(Size)符合盒約束的要求。

以下摘抄原文檔並翻譯,並加以分析。為了關註要點, 忽略crossAxis方向(水平方向)的處理

以下圖為Column布局實例。

給column布局進行了以下6步操作

首先給每個非flex子元素,設置豎直方向unbounded(無界)的盒約束。結合圖片,也就是將1、2兩個子設置好豎直方向無界的盒約束。示例中1和2設置了高度,因此壹***占用高度是5+3=8.

按flex的比例給flex元素分配剩余的空間。因為示例只有壹個flex元素,即3號元素,因此將占有剩余全部空間,高度是20-5-3 = 12。

在第二步中分配好空間的flex元素,給他設置的盒約束不是豎直方向unbounded(給非flex元素設置的是豎直方向unbounded),而是有界的盒約束,盒約束的maxHeight是12,即第二步中被分配的高度。

水平方向不解釋了。高度設置完了他去設置寬度。

Column組件的總高度是由mainAxisSize屬性決定的,如果值是MainAxisSize.max,Column的高度就是Column的盒約束的maxHeight值,示例中我們給Column設置了高度為20的bounded盒約束,假設Column.mainAxisSize=MainAxisSize.max,那麽Column的高度就是20.如果mainAxisSize=MainAxisSize.min,Column的高度將由其子元素的高度和決定。假設3號flex元素不設置成flex元素,而是固定高度為8,那麽Column的高度就是5+3+8=16.

設置子元素的位置,即設置靠左,靠右,居中,分散等,與本示例關系不大。

根據第壹步,inner column被outer column設置了無界(unbounded)的盒約束,Column會緊包children,而inner column的Expanded要撐開以占用inner column的剩余空間,這就沖突了。

解決方案:給inner column設置有界的盒約束即可。比如給inner column外包壹層有高度的Container。

下面這種方案,給inner column包壹層Expanded也可以,是因為在outer column中,Expanded會被設置成有界的盒約束(結合第三步),因此Expanded就可以向外擴展(expand)了。