Flutter官方并沒有對(duì)Widget進(jìn)行官方分類,對(duì)其分類主要是為了對(duì)Widget進(jìn)行功能區(qū)分。

定制網(wǎng)站設(shè)計(jì)可以根據(jù)自己的需求進(jìn)行定制,網(wǎng)站建設(shè)、網(wǎng)站制作構(gòu)思過程中功能建設(shè)理應(yīng)排到主要部位公司網(wǎng)站建設(shè)、網(wǎng)站制作的運(yùn)用實(shí)際效果公司網(wǎng)站制作網(wǎng)站建立與制做的實(shí)際意義
當(dāng)組件內(nèi)容超過當(dāng)前顯示窗口時(shí),如果沒有特殊處理,F(xiàn)lutter則會(huì)提示Overflow錯(cuò)誤。為此,F(xiàn)lutter提供了多種可滾動(dòng)組件用于顯示列表和長(zhǎng)布局。
在可滾動(dòng)組件的坐標(biāo)描述中,通常將滾動(dòng)方向稱為主軸,非滾動(dòng)方向稱為縱軸。由于可滾動(dòng)組件的默認(rèn)方向一般都是沿垂直方向,所以默認(rèn)情況下主軸就是指垂直方向,水平方向同理。
通常可滾動(dòng)組件的子組件可能會(huì)非常多、占用的總高度也會(huì)非常大;如果要一次性將子組件全部構(gòu)建出將會(huì)非常昂貴!為此,F(xiàn)lutter中提出一個(gè)Sliver(中文為“薄片”的意思)概念,如果一個(gè)可滾動(dòng)組件支持Sliver模型,那么該滾動(dòng)可以將子組件分成好多個(gè)“薄片”(Sliver),只有當(dāng)Sliver出現(xiàn)在視口中時(shí)才會(huì)去構(gòu)建它,這種模型也稱為“基于Sliver的延遲構(gòu)建模型”。
可滾動(dòng)組件中有很多都支持基于Sliver的延遲構(gòu)建模型,如ListView、GridView,但是也有不支持該模型的,如SingleChildScrollView。
在很多布局系統(tǒng)中都有ViewPort的概念,在Flutter中,術(shù)語ViewPort(視口),如無特別說明,則是指一個(gè)Widget的實(shí)際顯示區(qū)域。例如: 一個(gè)ListView的顯示區(qū)域高度是800像素,雖然其列表項(xiàng)總高度可能遠(yuǎn)遠(yuǎn)超過800像素,但是其ViewPort仍然是800像素。
可滾動(dòng)組件都直接或間接包含一個(gè)Scrollable組件
如果要給可滾動(dòng)組件添加滾動(dòng)條,只需將Scrollbar作為可滾動(dòng)組件的任意一個(gè)父級(jí)組件。
沿一個(gè)方向線性排布所有子組件。支持基于Sliver的延遲構(gòu)建模型。
ListView高度邊界無法確定時(shí)會(huì)異常。
默認(rèn)構(gòu)造函數(shù)有一個(gè)children參數(shù),它接受一個(gè)Widget列表。
實(shí)際上通過此方式創(chuàng)建的ListView和使用SingleChildScrollView+Column的方式?jīng)]有本質(zhì)的區(qū)別。
適合只有少量的子組件的情況,因?yàn)檫@種方式需要將所有children都提前創(chuàng)建好(這需要做大量工作),而不是等到子widget真正顯示的時(shí)候再創(chuàng)建,也就是說通過默認(rèn)構(gòu)造函數(shù)構(gòu)建的ListView沒有應(yīng)用基于Sliver的懶加載模型。
例
例
例(水平滾動(dòng))
適合列表項(xiàng)比較多(或者無限)的情況,因?yàn)橹挥挟?dāng)子組件真正顯示的時(shí)候才會(huì)被創(chuàng)建,也就說通過該構(gòu)造函數(shù)創(chuàng)建的ListView是支持基于Sliver的懶加載模型的。
例
例
例(不同類型的item)
ListView.separated可以在生成的列表項(xiàng)之間添加一個(gè)分割組件,它比ListView.builder多了一個(gè)separatorBuilder參數(shù),該參數(shù)是一個(gè)分割組件生成器。
例
例
類似于Android中的ScrollView,它只能接收一個(gè)子組件。
通常內(nèi)容不會(huì)超過屏幕太多時(shí)使用SingleChildScrollView,這是因?yàn)樗恢С只赟liver的延遲實(shí)例化模型,所以如果預(yù)計(jì)視口可能包含超出屏幕尺寸太多的內(nèi)容時(shí),那么使用SingleChildScrollView將會(huì)非常昂貴(性能差),此時(shí)應(yīng)該使用一些支持Sliver延遲加載的可滾動(dòng)組件,如ListView。
例(將大寫字母A-Z沿垂直方向顯示)
一個(gè)二維網(wǎng)格列表
GridView和ListView的大多數(shù)參數(shù)都是相同的。
橫軸為固定數(shù)量子元素。
GridView.count構(gòu)造函數(shù)內(nèi)部使用了SliverGridDelegateWithFixedCrossAxisCount。
例
例(GridView.count)
該子類實(shí)現(xiàn)了一個(gè)橫軸子元素為固定最大長(zhǎng)度的layout算法
例
當(dāng)子widget比較多時(shí),可以通過GridView.builder來動(dòng)態(tài)創(chuàng)建子widget。
GridView.builder 必須指定的參數(shù)有兩個(gè),其中itemBuilder為子widget構(gòu)建器。
例
舉個(gè)例子,假設(shè)有一個(gè)頁面,頂部需要一個(gè)GridView,底部需要一個(gè)ListView,而要求整個(gè)頁面的滑動(dòng)效果是統(tǒng)一的,即它們看起來是一個(gè)整體。如果使用GridView+ListView來實(shí)現(xiàn)的話,就不能保證一致的滑動(dòng)效果,因?yàn)樗鼈兊臐L動(dòng)效果是分離的。
所以這時(shí)就需要一個(gè)"膠水",把這些彼此獨(dú)立的可滾動(dòng)組件"粘"起來,而CustomScrollView的功能就相當(dāng)于“膠水”。
Sliver有細(xì)片、薄片之意,在Flutter中Sliver通常指可滾動(dòng)組件子元素。在CustomScrollView中,需要粘起來的可滾動(dòng)組件就是CustomScrollView的Sliver了,如果直接將ListView、GridView作為CustomScrollView是不行的,因?yàn)樗鼈儽旧硎强蓾L動(dòng)組件而并不是Sliver。
因此,為了能讓可滾動(dòng)組件能和CustomScrollView配合使用,F(xiàn)lutter提供了一些可滾動(dòng)組件的Sliver版,如SliverList、SliverGrid等。
實(shí)際上Sliver版的可滾動(dòng)組件和非Sliver版的可滾動(dòng)組件最大的區(qū)別就是前者不包含滾動(dòng)模型(自身不能再滾動(dòng)),而后者包含滾動(dòng)模型 ,也正因如此,CustomScrollView才可以將多個(gè)Sliver"粘"在一起,這些Sliver共用CustomScrollView的Scrollable,所以最終才實(shí)現(xiàn)了統(tǒng)一的滑動(dòng)效果。
例(SliverList)
例(SliverGrid)
可以用ScrollController來控制可滾動(dòng)組件的滾動(dòng)位置
例
滾動(dòng)位置恢復(fù)
ScrollPosition
ScrollController控制原理
滾動(dòng)監(jiān)聽
例
在 Flutter 中的組件樣式,都是通過組件上的 style 屬性進(jìn)行設(shè)置的,這與 React Native 很類似。
例如,在 Text 組件里設(shè)置樣式。
與 React Native 不同的是,有一些樣式不不能在 style 里面設(shè)置的。例如 width,height,color 等屬性。因?yàn)?Flutter 認(rèn)為這樣應(yīng)該是組件的屬性而不是樣式。
邊距只要是 padding(內(nèi)邊距) 和 margin(外邊距)兩個(gè)設(shè)置。邊距只適用于 Container。
如果要使用絕對(duì)定位,那么需要把內(nèi)容包裹在 Positioned 容器里,而 Positioned 又需要包裹在 Stack 容器里。
容器的邊框設(shè)置,使用 Border 對(duì)象。邊框只適用于 Container。
要設(shè)置容器的圓角,使用 BorderRadius 對(duì)象,它只能使用于 Container。
BorderRadius 有以下的屬性與方法。
在 Flutter 里設(shè)置陰影效果,需要使用 BoxShadow 對(duì)象。陰影效果只適用于 Container。
等效于 css 上的陰影效果設(shè)置。
場(chǎng)景:多個(gè)組件共用一個(gè)狀態(tài),子組件通過方法改變父組件狀態(tài)
思路:狀態(tài)和管理方法定義在父組件,通過構(gòu)造函數(shù)傳遞給子組件
其他子組件按照同樣方法接收即可共用該父組件的狀態(tài)。
分享名稱:flutter組件變換,flutter基礎(chǔ)組件
URL鏈接:http://chinadenli.net/article38/dsgpjpp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App開發(fā)、網(wǎng)站營(yíng)銷、品牌網(wǎng)站制作、電子商務(wù)、移動(dòng)網(wǎng)站建設(shè)、商城網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
營(yíng)銷型網(wǎng)站建設(shè)知識(shí)