真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

flutter約束布局,flutter 約束布局

Flutter Stack 的布局規(guī)則

Stack 是可以將視圖根據(jù)children中子組件的順序進(jìn)行疊加的組件,根據(jù)子組件是否被Positioned包裹判斷布局的方式

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、微信小程序定制開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了資源免費(fèi)建站歡迎大家使用!

Stack 的fit 屬性用來控制Stack如何將自己的父級組件的尺寸約束傳達(dá)給無位置組件,通過fit屬性約束Stack中無位置組件的尺寸,默認(rèn)值是 StackFie.loose. 如:Stack的父級組件要求Stack的尺寸是 200x200 ~ 500x500.在默認(rèn)的StackFit.loose(寬松狀態(tài))下,Stack 可以運(yùn)行其children在不違反父級約束的前提下,自由選擇尺寸,即可在0x0~500x500的范圍內(nèi)任意選擇。相反如何傳入的fit是StackFit.expand(擴(kuò)張狀態(tài))下,則會(huì)要求所有無位置children必須占滿父級約束的最大空間,即尺寸必須為500x500,最后當(dāng)傳入的StackFit.passthrough(穿透狀態(tài))時(shí),Stack會(huì)將自己父級組件的尺寸約束直接傳遞給子組件,即保留原有的200x200 ~ 500x500的約束。

StackFie.loose 和StackFit.passthrough的效果

StackFit.expand的效果

Flutter開發(fā)--如何布局?

相對于iOS開發(fā),F(xiàn)lutter的布局更具有靈活性,每個(gè)頁面設(shè)計(jì)都不一樣,相同頁面可選擇的布局方式也不一樣,如果單純的說應(yīng)該如何去布局,我覺得不現(xiàn)實(shí),大家可以參考下 Flutter官方的布局教程 。接下來,筆者,通過項(xiàng)目中的一個(gè)頁面,來一步一步的拆解布局的流程。整個(gè)過程,基本上按照拆解、組件封裝、具體布局這三步來的。

根據(jù)設(shè)計(jì)圖,可以看出整體可以分成兩部分,上面一部分是系統(tǒng)介紹模塊,下面一部分是真正的登錄內(nèi)容,因?yàn)樯婕暗蒋B加,因此考慮用Stack;

系統(tǒng)介紹模塊部分:整體也是涉及到疊加,考慮用Stack,分為四部分。最底部漸變色背景用一個(gè)contanier,無須指定位置,全視圖擴(kuò)展;載放logo圖標(biāo)在上一層,用Image。最后兩個(gè)Text同級放在最上層。Image,Text各用Positioned包裹去指定位置。

登錄內(nèi)容模塊是最外層是一個(gè)Contanier容器,去控制背景色和圓角。然后是一個(gè)Column元素,逐行排列。

第一行為Image,

第二行為Text,

第三行可以看成一個(gè)小Column,分兩塊進(jìn)行布局

第四行可以看成一個(gè)小Column,分兩塊進(jìn)行布局

第五行可以看作一個(gè)TextButton,

第六行可以看作一個(gè)Row,分三塊進(jìn)行布局

通過上面這樣一步一步的分析后,基本上對大致的布局有了一個(gè)了解,最外層的控件大致選對(只要能實(shí)現(xiàn)的話,就是復(fù)雜度以及效率的問題),然后一步一步的拆解每一行的元素,如果有重復(fù)的或者覺得可以封裝出來的部分,則進(jìn)行下一步。

每一行的拆解,大致也是按照這個(gè)思路來進(jìn)行,因此筆者在這里就不做講解了。

在做到第三第四行的時(shí)候,發(fā)現(xiàn)這兩個(gè)很相似,而且設(shè)計(jì)到一些交互邏輯,筆者就想對第三第四行的這種展示進(jìn)行封裝,覺得今后的布局可能會(huì)用到,因此在這一步,可以先把這一塊兒抽離出一個(gè)控件。利用TextField來實(shí)現(xiàn)這種輸入操作,具體的實(shí)現(xiàn)筆者不再詳細(xì)的描述了。

經(jīng)過這一步,整體的規(guī)劃設(shè)計(jì)圖已經(jīng)有了,各個(gè)組件也都有了,接下來的工作就是組裝了。

具體布局設(shè)計(jì)到一些細(xì)節(jié)的地方,例如整體Column的居中對齊(crossAxisAlignment)、間隔(Padding或Container包裹,筆者更喜歡用SizedBox占位)、居左居右居中(Align)、點(diǎn)擊事件(GestureDetector)以及圓角(BorderRadius)等一些特殊情況。

像第六行row是放在底部的,就可以在第六行前面增加一個(gè)Spacer()去填充空白區(qū)域。

對文字顏色大小等,可以用TextStyle直接設(shè)置。

對于輸入框的刪除按鈕,可以用Offstage這種Flutter特有的控制顯示隱藏的控件。

Flutter-布局

flutter布局需要先了解flutter所有布局的widget,首先flutter布局分為Container、RenderObjectWidget和ParentDataWidget。而RenderObject中經(jīng)常使用的有SingleChildRenderObjectWidget(單節(jié)點(diǎn))和MultiChildRenderObjectWidget(多節(jié)點(diǎn))。

flutter中基礎(chǔ)的widget,可以為子節(jié)點(diǎn)設(shè)置內(nèi)間距。當(dāng)padding沒有child的時(shí)候,它會(huì)產(chǎn)生一個(gè)寬為left+right,高為top+bottom的區(qū)域,當(dāng)padding的child不為空的時(shí)候會(huì)將約束傳遞給child。一般在使用間距的地方使用。

設(shè)置child的對齊方式,并根據(jù)child的尺寸調(diào)整自身的尺寸。

設(shè)置透明度

用于矩形圓角裁剪組件

用于圓形裁剪,但是可以添加陰影和Z軸

給組件繪制區(qū)域大小

百分比布局,可以通過widthFactor或者h(yuǎn)eightFactor設(shè)置寬高占比

子組件疊加布局,也稱絕對布局

mainAxisAlignment: start:頂頭 center:居中 end:接尾 spaceAround:中間的孩子均分,兩頭的孩子空一半 spaceBetween:頂頭接尾其他均分 spaceEvenly:均勻分布

crossAxisAlignment: start:頂頭 center:居中 end:接尾 stretch:伸展

mainAxisSize: max:父容器沒有約束的話,column自身會(huì)盡可能延伸 min:不會(huì)延伸,只會(huì)包裹自己

屬性和column屬性一致,只是方向不同,一個(gè)豎直方向一個(gè)水平方向。使用方法也類似。

Wrap可以實(shí)現(xiàn)流布局,單行的Wrap跟Row一樣,單列的Wrap則跟Colum一樣.但是Row和Column都是單行單列的,Wrap可以多行多列。

Wrap能做的事情,flow也能做。但是flow會(huì)比較復(fù)雜點(diǎn)。flow類似于OC中CollectionLayout,需要自己實(shí)現(xiàn)子組件的位置以及大小。但是flow的性能比較好,靈活。

自定義FlowDelegate

運(yùn)行結(jié)果:

絕對定位布局,用于指定組件的具體位置

Expanded組件可以使row、column或者flex子組件在其主軸上展開并填充可用空間。如果多個(gè)組件展開的話,會(huì)按照比例分割。

Tip:Expanded組件要在row、column或者flex的子組件中使用。具有兩個(gè)屬性,child:子組件,flex:所占比例

2020-05-15 flutter BoxConstraints and layout

在出現(xiàn)布局錯(cuò)誤時(shí)能盡快找到錯(cuò)誤原因。

以下是對關(guān)鍵內(nèi)容的翻譯和注解。

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

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

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

我猜測,在將盒約束向子傳遞的過程中,子會(huì)根據(jù)父的盒約束,設(shè)置自己的盒約束,而不是單純的繼承父的盒約束。稍后結(jié)合Flex布局可以解釋。

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

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

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

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

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

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

以下摘抄原文檔并翻譯,并加以分析。為了關(guān)注要點(diǎn), 忽略crossAxis方向(水平方向)的處理 。

以下圖為Column布局實(shí)例。

給column布局進(jìn)行了以下6步操作

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

按flex的比例給flex元素分配剩余的空間。因?yàn)槭纠挥幸粋€(gè)flex元素,即3號元素,因此將占有剩余全部空間,高度是20-5-3 = 12。

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

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

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

設(shè)置子元素的位置,即設(shè)置靠左,靠右,居中,分散等,與本示例關(guān)系不大。

根據(jù)第一步,inner column被outer column設(shè)置了無界(unbounded)的盒約束,Column會(huì)緊包c(diǎn)hildren,而inner column的Expanded要撐開以占用inner column的剩余空間,這就沖突了。

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

下面這種方案,給inner column包一層Expanded也可以,是因?yàn)樵趏uter column中,Expanded會(huì)被設(shè)置成有界的盒約束(結(jié)合第三步),因此Expanded就可以向外擴(kuò)展(expand)了。

Flutter 基礎(chǔ)布局Widgets之ConstrainedBox詳解

ConstrainedBox即創(chuàng)建一個(gè)Widget,該Widget對其子child施加附加約束。之前在constrain也有簡單使用,即該組件一般集成在constrain中使用。


網(wǎng)站欄目:flutter約束布局,flutter 約束布局
文章來源:http://weahome.cn/article/hocjdh.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部