• <ul id="cgeq2"></ul>
  • 歡迎您光臨深圳塔燈網(wǎng)絡(luò)科技有限公司!
    電話圖標(biāo) 余先生:13699882642

    網(wǎng)站百科

    為您解碼網(wǎng)站建設(shè)的點點滴滴

    Flutter 布局控件完結(jié)篇

    發(fā)表日期:2018-09 文章編輯:小燈 瀏覽次數(shù):5887

    本文對Flutter的29種布局控件進行了總結(jié)分類,講解一些布局上的優(yōu)化策略,以及面對具體的布局時,如何去選擇控件。

    1. 系列文章

    1. Flutter 布局詳解
    2. Flutter 布局(一)- Container詳解
    3. Flutter 布局(二)- Padding、Align、Center詳解
    4. Flutter 布局(三)- FittedBox、AspectRatio、ConstrainedBox詳解
    5. Flutter 布局(四)- Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth詳解
    6. Flutter 布局(五)- LimitedBox、Offstage、OverflowBox、SizedBox詳解
    7. Flutter 布局(六)- SizedOverflowBox、Transform、CustomSingleChildLayout詳解
    8. Flutter 布局(七)- Row、Column詳解
    9. Flutter 布局(八)- Stack、IndexedStack、GridView詳解
    10. Flutter 布局(九)- Flow、Table、Wrap詳解
    11. Flutter 布局(十)- ListBody、ListView、CustomMultiChildLayout詳解

    1.1 亂侃

    前前后后也算是拖拖拉拉的寫了一些Flutter的文章,寫的也都比較粗略。最近工作調(diào)動,內(nèi)部換了部門,一頓瞎忙活,也打亂了原本的分享計劃。

    從我最開始接觸Flutter到現(xiàn)在,差不多四個多月了。在這段時間里面,F(xiàn)lutter也發(fā)布了Release Preview版本。各個技術(shù)網(wǎng)站本著先撥頭籌的心態(tài),推廣了幾波,國內(nèi)的人氣跟著也起來了不少。全世界Flutter開發(fā)人員中,國內(nèi)從業(yè)者占據(jù)了很大的比重,這個現(xiàn)象本身并不能說明什么,不過可以反映一點,有商業(yè)訴求吧。當(dāng)然觀望的還是占絕大部分,除了一些個人開發(fā)者愛折騰外,也就是一些大的業(yè)務(wù)成熟到不能再成熟的團隊,內(nèi)部消化人員去折騰這個了。

    插個題外話,有感于最近的工作變動,這段時間胡思亂想的比較多。一門技術(shù)對程序員來說到底意味著什么?如果不需要再為生計奔波,是否還會對目前已上手的技術(shù)感興趣?如果你現(xiàn)在的項目所需要的技術(shù),對你個人而言毫無加成,只會浪費你的時間,讓你在已有的技術(shù)棧上漸行漸遠(yuǎn),你是否還會參與這個項目。只有極少數(shù)人會遇上逆天改命的項目,不管參與什么項目,技術(shù)人員的立身之本始終是技術(shù)(高管或者打算換行的除外),技術(shù)的選型,除去時間效率后續(xù)維護等普適性的考慮要素外,排在第一位的始終應(yīng)該是對自身的提高,扯的有些遠(yuǎn)了哈。

    1.2 本質(zhì)

    我數(shù)了一下我文章總結(jié)過的布局控件,總共有29種。乍看會覺得真雞毛的多,不乍看,也會覺得雞毛的真多。為什么其他的移動平臺沒有這么多布局控件呢?其實不然,其他平臺沒有這么細(xì)分。

    以Android平臺為例,最基礎(chǔ)的幾種布局例如LinearLayout、RelativeLayout、ConstraintLayout等等。很多Flutter的控件,對于Android來說,僅僅是一個屬性的設(shè)置問題。

    再往上看,iOS、Android、Web這些平臺的布局,其實最基本就那幾種,線性布局、絕對布局、相對布局等等。Flutter也逃不出這些,那為什么Flutter現(xiàn)在有這么多布局控件呢?

    • 第一點,之前文章介紹過的,F(xiàn)lutter的理念是萬物皆為widget。這和Flutter的實現(xiàn)機制有關(guān),而不是因為它在布局上有什么特殊性,這也是最主要的一點。

    • 第二點,我覺得是因為這是Flutter的初期,如果有經(jīng)歷過一個技術(shù)的完整發(fā)展周期,就會明白,前期只是提供各種零件,只有商業(yè)支撐或者人員支撐足夠的時候,才會去優(yōu)化零件。而現(xiàn)在就是這么一種資源不足的狀態(tài)。各種組件可以合并的有很多,底層的實現(xiàn)機制不會變,只是再加一層即可,這也是可以造輪子的地方,例如封裝一套適用于Android、iOS或者Web人員的控件庫等。

    • 第三點,跟初期相關(guān),一套新的技術(shù),各種東西不可能一下子全想明白,路總是走著走著才發(fā)現(xiàn)走歪了,就像一些控件,可能一些地方合適,但是一些新的地方又不太合適,所以就再造一個,所以有些控件看起來功能十分相似。

    說了這么多,我其實就想說明一點,F(xiàn)lutter現(xiàn)在還只是處在社會發(fā)展的初級階段,還處在溫飽問題都解決不了的狀態(tài),想達到小康還需要很長的一段路要走。

    2. 單節(jié)點控件

    單節(jié)點控件,顧名思義就是只有一個節(jié)點的布局控件。這種控件有多少個呢,我之前文章總結(jié)過的有18種,現(xiàn)階段還是不排除增加的可能,哈哈。

    2.1 分類

    在這小節(jié)里,我嘗試從多個維度去對這些控件進行分類,希望這樣可以幫助大家理解。

    2.1.1 按照繼承劃分

    Flutter單節(jié)點布局控件繼承分類

    上面是這18種控件的父節(jié)點層面的繼承關(guān)系,唯一不同的一個控件就是Container。所以按照是否繼承自SingleChildRenderObjectWidget的分類如下:

    • 繼承自StatelessWidget的控件,有Container。
    • 繼承自SingleChildRenderObjectWidget的控件,有Padding、Align、Center、FittedBox、AspectRatio、ConstrainedBox、Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth、LimitedBox、Offstage、OverflowBox、SizedBox、SizedOverflowBox、Transform、CustomSingleChildLayout。

    Container是一個組合控件,不是一個基礎(chǔ)控件,這點從繼承關(guān)系就可以看出來。

    2.1.2 按照功能是否單一劃分

    分類如下:

    • 功能不單一的控件,Container、Transform、FittedBox、SizedOverflowBox。
    • 功能單一的控件,有Padding、Align、Center、AspectRatio、ConstrainedBox、Baseline、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth、LimitedBox、Offstage、OverflowBox、SizedBox、CustomSingleChildLayout。

    先在此處小結(jié)一下,可以看出Container的特殊之處了吧,為什么Container這么特殊了。這個特殊要從兩個層面去看。

    • 對于Flutter而言,Container是特殊的,因為它不是功能單一的控件,是一個組合的控件,所以它相對于Flutter是特殊的。
    • 對于移動端開發(fā)者而言,它不是特殊的,因為很多UI都是一些基礎(chǔ)功能組合的,這樣能讓開發(fā)者更方便的使用。

    那能得出什么結(jié)論呢?我個人覺得,Container這種組合的控件會越來越多,也會有個人開發(fā)者去開發(fā)這種通用型的組合控件,這是一個大趨勢,是Flutter走向易用的一小步。

    2.1.3 按照功能劃分

    在此處我按照定位、尺寸、繪制三部分來嘗試著去做功能的劃分,當(dāng)然這個劃分并不絕對,仁者見仁吧。

    • 定位控件:Container、Align、Center、FittedBox、Baseline、Transform。
    • 尺寸控件:Container、FittedBox、AspectRatio、ConstrainedBox、FractionallySizedBox、IntrinsicHeight、IntrinsicWidth、LimitedBox、SizedBox、SizedOverflowBox。
    • 繪制控件:Container、Padding、Offstage、OverflowBox、SizedOverflowBox、Transform。

    有一個控件并沒有歸到這三類中,CustomSingleChildLayout可以自定義實現(xiàn),此處不做分類。Baseline可以把它放到繪制里面去,此處我按照調(diào)節(jié)文字的位置去做分類,這個大家知道就行,并不是說只能這么劃分。

    對于繪制控件,其實分的有些雜,我把顯示相關(guān)的都?xì)w到這里,例如是否顯示、內(nèi)邊距、是否超出顯示以及變形等等。

    每一種大類,F(xiàn)lutter都提供了多種控件。經(jīng)過這么劃分,可以看出很多控件功能的交叉,很多時候一個屬性的事情,F(xiàn)lutter還是分出了一個控件。

    Flutter單節(jié)點布局控件功能分類

    2.2 使用

    單節(jié)點控件雖然這么多,但是大部分不會挨個去嘗試。對于大部分人而言,都是佛系的用法,一個控件能夠使用,就一直用到死。

    在布局上,大方向還是不停的,把一張設(shè)計圖,拆成一棵樹,每個節(jié)點根據(jù)需要,選擇合適的控件,然后從根部開始不停嵌套,布局就完成了。

    2.3 控件的選擇

    控件種類繁多,真正使用的時候該如何去選擇呢?有萬金油的做法,不管啥都用Container,這也是很多初接觸的人經(jīng)常干的方式。這么做的確可以按照設(shè)計圖把布局給實現(xiàn)了,但是會涉及到一些性能上的問題。

    控件的選擇,按照控件最小功能的標(biāo)準(zhǔn)去選擇。例如需要將子節(jié)點居中,可以使用Container設(shè)置alignment的方式,也可以使用Center。但是從功能上,Center是最小級別的,因此選擇它的話,額外的開銷會最小。

    將UI實現(xiàn)了,這只是最基本的,當(dāng)達到這一步了,應(yīng)該更多的去思考,如何更好的布局,使得性能更高。

    3. 多節(jié)點控件

    多節(jié)點控件的種類就少了一些,雖然也有11種,但是功能和場景多了,所以選擇上反而會簡單一些。

    3.1 分類

    多節(jié)點控件內(nèi)部實現(xiàn)比單節(jié)點控件復(fù)雜的多,會從繼承以及功能兩個方向去做分類。

    3.1.1 按照繼承劃分

    Flutter多節(jié)點布局控件繼承分類

    從上圖可以看出,多節(jié)點布局控件基本上可以分為三條線

    • 繼承自BoxScrollView的控件,有GridView以及ListView;
    • 繼承自MultiChildRenderObjectWidget的控件,有Row、Column、Flow、Wrap、Stack、IndexedStack、ListBody、CustomMultiChildLayout八種;
    • 繼承自RenderObjectWidget的控件,有Table一種。

    之前介紹過,GridView和ListView的實現(xiàn)都是非常相似的,基本上就是silvers只包含一個Sliver(GridView為SilverGrid、ListVIew為SliverList)的CustomScrollView。 這也是為啥這兩元素都繼承自BoxScrollView的緣故。

    MultiChildRenderObjectWidget類,官方解讀如下

    A superclass for RenderObjectWidgets that configure RenderObject subclasses
    that have a single list of children.

    它只是一個含有單一list子節(jié)點的控件,為什么Table不需要繼承自MultiChildRenderObjectWidget呢?

    這是因為Table的子節(jié)點是二維(橫豎)的,而MultiChildRenderObjectWidget提供的是一個一維的子節(jié)點管理,所以必須繼承自RenderObjectWidget。知道了這些過后,對繼承關(guān)系的理解會有更好的幫助。

    3.1.2 按照功能劃分

    這個對于多節(jié)點布局控件來說,還是比較難以劃分的,筆者試著做了如下劃分:

    • 列表:GridView、ListView;
    • 單列單行或者多列多行:Row、Column、Flow、Wrap、ListBody、Table;
    • 顯示位置相關(guān):Stack、IndexedStack、CustomMultiChildLayout。

    個人覺得這種分類方式不是特別的穩(wěn)妥,但還是寫下來了,請大家仁者見仁。

    GridView和ListView分為一類,一個是因為其實現(xiàn)非常的相似,另一個原因是這兩個控件內(nèi)容區(qū)域可以無限,不像其他控件的內(nèi)容區(qū)域都是固定的,因此將這兩個劃分為一類。

    關(guān)于單列單行多列多行的,也并不是說很嚴(yán)格的,Row、Column、Table、ListBody可能會遵守這種劃分,F(xiàn)low以及Wrap則是近似的多列多行。這種劃分絕對不是絕對的,只是個人的一種考量劃分方式。

    3.2 使用

    多節(jié)點控件種類較少,而且功能重疊的很少,因此在使用上來說,還是簡單一些。比較常用的GridView、ListView、Row、Column、Stack,這幾個控件基本上涵蓋了大部分的布局了。

    3.3 控件的選擇

    多節(jié)點控件功能重疊的較少,因此選擇上,不會存在太多模凌兩可的問題,需要什么使用什么即可。

    4. 性能優(yōu)化

    性能優(yōu)化這塊兒,可能仁者見仁,并沒有一個統(tǒng)一的說法,畢竟現(xiàn)在Flutter各方面都還不完善。但是,大方向還是有的,盡量使用功能集更小的控件,這個對于渲染效率上還是有所幫助的。

    4.1 優(yōu)化

    在這里我試著去列舉一些,并不一定都正確。

    • 對于單節(jié)點控件,如果一個布局多個控件都可以完成,則使用功能最小的,可以參照上面控件分類中的功能劃分來做取舍;
    • 對于多節(jié)點控件,如果單節(jié)點控件滿足需求的話,則去使用單節(jié)點控件進行布局;
    • 對于ListView,標(biāo)準(zhǔn)構(gòu)造函數(shù)適用于條目比較少的情況,如果條目較多的話,盡量使用ListView.builder;
    • 對于GridView,如果需要展示大量的數(shù)據(jù)的話,盡量使用GridView.builder;
    • Flow、Wrap、Row、Column四個控件,單純論效率的話,F(xiàn)low是最高效的,但是使用起來是最復(fù)雜的;
    • 如果是單行或者單列的話,Row、Column比Table更高效;
    • Stack和CustomMultiChildLayout如果同時滿足需求的話,CustomMultiChildLayout在某些時候效率會更高一些,但是取決于Delegate的實現(xiàn),且使用起來更加的復(fù)雜;

    上面所列的比較雜,但是歸納起來,無非這幾點:

    • 功能越少的控件,效率越高;
    • ListView以及GridView的builder構(gòu)造函數(shù)效率更高;
    • 實現(xiàn)起來比較復(fù)雜的控件,效率一般會更高。

    4.2 選擇

    控件的選擇,個人覺得把握大方向就夠了。如果時間緊急,以實現(xiàn)效率最優(yōu)先,如果時間充裕的話,可以按照一些優(yōu)化細(xì)則,去做一些選擇。單純控件層面,帶來性能上的改進畢竟十分有限。

    5. 實戰(zhàn)

    首先看一下實際的效果圖,這個是之前做工程中,比較復(fù)雜的一個界面吧,就算放到native上看,也是比較復(fù)雜的。

    Flutter復(fù)雜頁面樣例

    這個頁面中有不少自定義控件,例如日期選擇、進度等。整體看著復(fù)雜,實現(xiàn)起來其實也還好。關(guān)于如何布局拆解,之前文章有過介紹,在這里不再闡述,訣竅就是一個字----拆。

    5.1 關(guān)于自定義控件

    自定義控件一般都是繼承自StatelessWidget、StatefulWidget。也有一些特殊的,例如上面的進度控件,直接使用Canvas畫的。

    對于需要更新狀態(tài)的,一般都是繼承自StatefulWidget,對于不需要更新狀態(tài)的,使用StatelessWidget即可,能夠使用StatelessWidget的時候,也盡量使用它,StatefulWidget在頁面更新的時候,會存在額外的開銷。

    Flutter的自定義控件,寫起來可能會比原生的更簡單,它更多的是一些基礎(chǔ)控件的組合使用,而很少涉及到底層的一些重寫。

    5.2 關(guān)于生命周期

    這是很蛋疼的一個問題,一個純Flutter的App,類似于Android中的單Activity應(yīng)用。某個具體的頁面就算去監(jiān)聽native層的生命周期,也僅僅是獲取到base activity的,而無法獲取到頁面層級的。

    5.3 感想

    Flutter如果輪子足夠的話,還是非常吸引人的,在熟悉了這些基礎(chǔ)組件過后,編寫起來,速度會非常快。自定義控件的實現(xiàn),也比較簡單。但是,性能方面,還是存在比較大的問題,復(fù)雜頁面首次載入,速度還是比較慢。對于高端機型來說,整體流暢度很不錯,堪比原生的app,低端機型,表現(xiàn)就比較捉急吧。整體來說,F(xiàn)lutter表現(xiàn)還是挺不錯的,可以上手試試,把玩把玩吧。就是寫起來,寫著寫著就覺得惡心,是真的惡心的那種惡心,看著各種嵌套標(biāo)簽,感覺被降維成了web開發(fā)。

    近期看到一些基于Flutter的自動布局解決方案,之前也有想過,完全可以基于Flutter做出布局的工具,僅僅是拖拽就可以實現(xiàn)完成度非常高的布局頁面。也得益于Flutter本身的思想和實現(xiàn)機制,web方面的很多東西,個人覺得都可以借鑒到Flutter上。單純從UI層來說,F(xiàn)lutter確實有自己獨特的地方。如果Flutter在最開始,就僅僅是一套跨平臺的UI的話,可能更容易被人們接受吧。

    前幾天看了官方的camera插件,還是挺蛋疼的,對于國內(nèi)的Android端來說,直接拿來商用幾乎是不可能的。插件基于camera2去實現(xiàn),國內(nèi)大部分廠商對于camera2的支持很差,一些很容易復(fù)現(xiàn)的crash也沒有去解決。

    如果決定在現(xiàn)有項目中使用Flutter,則需要做好埋坑造輪子的覺悟。如果人力緊缺的話,不應(yīng)該在這上面去投入,人力富余的時候,可以投入人力跟進研究,讓業(yè)界覺得你們很棒很前沿。

    6. 后話

    筆者建了一個Flutter學(xué)習(xí)相關(guān)的項目,Github地址,里面包含了筆者寫的關(guān)于Flutter學(xué)習(xí)相關(guān)的一些文章,會定期更新,也會上傳一些學(xué)習(xí)Demo,歡迎大家關(guān)注。

    7. 參考

    1. Flutter 布局詳解

    本頁內(nèi)容由塔燈網(wǎng)絡(luò)科技有限公司通過網(wǎng)絡(luò)收集編輯所得,所有資料僅供用戶學(xué)習(xí)參考,本站不擁有所有權(quán),如您認(rèn)為本網(wǎng)頁中由涉嫌抄襲的內(nèi)容,請及時與我們聯(lián)系,并提供相關(guān)證據(jù),工作人員會在5工作日內(nèi)聯(lián)系您,一經(jīng)查實,本站立刻刪除侵權(quán)內(nèi)容。本文鏈接:http://www.juherenli.com/18391.html
    相關(guān)APP開發(fā)
     八年  行業(yè)經(jīng)驗

    多一份參考,總有益處

    聯(lián)系深圳網(wǎng)站公司塔燈網(wǎng)絡(luò),免費獲得網(wǎng)站建設(shè)方案及報價

    咨詢相關(guān)問題或預(yù)約面談,可以通過以下方式與我們聯(lián)系

    業(yè)務(wù)熱線:余經(jīng)理:13699882642

    Copyright ? 2013-2018 Tadeng NetWork Technology Co., LTD. All Rights Reserved.    

    久久精品国产免费| 女人高潮内射99精品| 亚洲精品国产精品乱码视色 | 亚洲精品视频在线播放| 国产在线精品一区二区不卡麻豆| 视频久re精品在线观看| 久久久久成人精品无码中文字幕| 久久国产乱子伦精品免费午夜| 精品久久综合一区二区| 97久久精品无码一区二区| 久久国产精品免费专区| 99热成人精品热久久669| www久久只有这里有精品| 国产精品亚洲精品久久精品| 国产99视频精品一区| 久久国产精品系列| 国产亚洲福利精品一区| 久久国产精品免费一区二区三区| 国产精品不卡在线| 尤物国午夜精品福利网站| 2021国内久久精品| 91热成人精品国产免费| 99精品国产三级在线观看| 亚洲国产精品VA在线看黑人 | 久久夜色撩人精品国产小说| 日本五区在线不卡精品| 精品国产不卡在线电影| 亚洲AV无码国产精品永久一区| 国产精品福利在线观看| 亚洲国产精品午夜电影| 亚洲欧洲精品久久| 91精品国产色综久久| 91人妻人人澡人人爽人人精品| 精品亚洲麻豆1区2区3区| 99精品国产高清一区二区| 嫩草伊人久久精品少妇AV| 97视频精品全国在线观看| 一区二区三区四区精品视频| 亚洲一区精品中文字幕| 精品性影院一区二区三区内射 | 精品久久久久久无码中文字幕一区 |