做自(zì)由與創造的先行者

Flutter 盒約束

Flutter開(kāi)發手冊

介紹

在Flutter中,widget由其底層的RenderBox對(duì)象渲染。 渲染框由它們的父級給出約束,并且在這(zhè)些(xiē)約束下(xià)調整自(zì)身大(dà)小(xiǎo)。約束由最小(xiǎo)寬度、最大(dà)寬度和(hé)高(gāo)度組成; 尺寸由特定的寬度和(hé)高(gāo)度組成。

通常,按照widget如何處理(lǐ)他(tā)們的約束來(lái)看(kàn),有三種類型的盒子:

盡可能(néng)大(dà)。 例如 Center 和(hé) ListView 的渲染盒

跟随子widget大(dà)小(xiǎo)。 例如, Transform 和(hé) Opacity 的渲染盒。

指定尺寸。 例如, Image 和(hé) Text的渲染盒

一些(xiē)widget,例如Container, 會(huì)根據構造函數參數的不同而不同。Container默認是盡可能(néng)大(dà)的占用(yòng)空(kōng)間, 但(dàn)是如果你(nǐ)給它指定一個width,那它就會(huì)采用(yòng)指定的值。

其他(tā)一些(xiē),例如Row 和(hé) Column (flex boxes) 會(huì)根據給定它們的約束的不同而不同,如下(xià)面的“Flex”部分所述。

這(zhè)些(xiē)約束有時(shí)是“tight”,這(zhè)意味着它們沒有留下(xià)讓渲染框自(zì)己決定大(dà)小(xiǎo)的空(kōng)間(例如,如果最小(xiǎo)和(hé)最大(dà)寬度相同,也(yě)就是說有一個tight寬度)。 其中的主要例子是App widget, 它是RenderView類包含的一個widget :由應用(yòng)程序build函數返回的子widget的渲染框被指定了(le)一個約束,強制它精确填充應用(yòng)程序的内容區(qū)域(通常是整個屏幕)。 Flutter中的許多盒子,特别是那些(xiē)隻包含一個子widget的,都會(huì)将其約束傳遞給他(tā)們的孩子。 這(zhè)意味着如果您在應用(yòng)程序的渲染樹的根部嵌套一些(xiē)盒子,那麽子節點都要受到(dào)這(zhè)些(xiē)渲染盒的約束。

有些(xiē)箱子放(fàng)松了(le)約束,有“最大(dà)”約束,但(dàn)沒有“最小(xiǎo)”約束。例如,Center。

無邊界約束

在某些(xiē)情況下(xià),渲染盒的約束将是無邊界(unbounded)的或無限的。這(zhè)意味着最大(dà)寬度或最大(dà)高(gāo)度會(huì)設置爲double.INFINITY。

一個本身試圖占用(yòng)盡可能(néng)大(dà)的渲染盒在給定無邊界約束時(shí)不會(huì)有用(yòng),在檢查模式下(xià)(譯者語:指Dart的checked模式),會(huì)抛出異常。

渲染盒具有無邊界約束的最常見情況是在自(zì)身處于彈性盒(Row 和(hé) Column)内以及可滾動區(qū)域 (ListView 和(hé)其他(tā)ScrollView的子類)内。

特别是,ListView試圖擴充以适應其橫向可用(yòng)空(kōng)間(即,如果它是一個垂直滾動塊,它将嘗試與其父項一樣寬)。 如果您ListView在水(shuǐ)平滾動的情況下(xià)嵌套垂直滾動的ListView,則内部滾動區(qū)域會(huì)盡可能(néng)寬,這(zhè)是無限寬的,因爲外(wài)部滾動區(qū)域可以在水(shuǐ)平方向上(shàng)一直滾動。

Flex

彈性盒自(zì)身(Row和(hé)Column) 的行爲有所不同,這(zhè)取決于它們在給定的方向上(shàng)是處于有邊界的限制還是無邊界的限制下(xià)。

在有邊界的限制下(xià),他(tā)們在這(zhè)個方向上(shàng)會(huì)盡可能(néng)大(dà)。

在無邊界的限制下(xià),他(tā)們試圖讓自(zì)己的子節點在這(zhè)個方向自(zì)适應。 在這(zhè)種情況下(xià),您不能(néng)将子節點的flex屬性設置爲0以外(wài)的任何值(默認值爲0)。 在widget庫中,這(zhè)意味着一個彈性盒位于另一個彈性盒或可滾動的盒子内部時(shí),你(nǐ)不能(néng)使用(yòng)Expanded。 如果你(nǐ)這(zhè)樣做,你(nǐ)會(huì)得到(dào)一個異常消息。

在 交叉 方向上(shàng), 例如在Column的寬度和(hé)在Row的高(gāo)度上(shàng),它們絕不能(néng)是無界的,否則它們将無法合理(lǐ)地對(duì)齊他(tā)們的子節點。

網站(zhàn)建設開(kāi)發|APP設計(jì)開(kāi)發|小(xiǎo)程序建設開(kāi)發
下(xià)一篇:Flutter 資源和(hé)圖片
上(shàng)一篇:Flutter 自(zì)定義字體