
PS:轉(zhuǎn)載請注明出處
作者: TigerChain
地址: http://m.itdecent.cn/p/734312117518
本文出自 TigerChain 簡書 從頭開始整 Flutter系列
教程簡介
- 1、閱讀對象
本篇教程適合新手閱讀,老手直接略過 - 2、教程難度
初級,本人水平有限,文章內(nèi)容難免會出現(xiàn)問題,如果有問題歡迎指出,謝謝
正文
一、組件化思想
我們前面說過 Flutter 是借鑒了 React 的組件化思想,一切皆組件「小部件」,在 Flutter 中一個個組件就是一個類「當(dāng)然我們知道類就有屬性和方法」,為什么要有組件化思想,這是前端的一大進(jìn)步「可以說 React 功不可沒」,組件化其實就是封裝的粒度,把小小的按鈕或是界面封裝成一個個小組件便于維護(hù)和擴(kuò)展「也便于團(tuán)隊協(xié)作」,團(tuán)隊中可以封裝一些公共的組件,后期使用即可「一次編寫,到處使用」,再重聲一遍在 Flutter 中小部件和我們說的組件是一個東西「只不過我習(xí)慣說組件,保不齊會兩者都說,大家知道是一個東西即可」
二、Flutter 中的組件
Flutter 中的組件分為兩種
1、無狀態(tài)組件
無狀態(tài)組件定義
無狀態(tài)組件就是不能修改狀態(tài)的組件,也就是傳遞過去的值不能動態(tài)修改,我們說過組件是一個類,無狀態(tài)組件就是繼承 StatelessWidget 類的組件
無狀態(tài)組件聲明
class CustomWidget extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Container(
);
}
}
即通過繼承 StatelessWidget 類并重寫其 build 方法就可以聲明一個無狀態(tài)組件「build 方法就相當(dāng)于 React 中的 Render 方法」
2、有狀態(tài)組件
有狀態(tài)組件定義
有狀態(tài)組件和無狀態(tài)組件是相對的即我們想動態(tài)修改數(shù)據(jù)的時候必須定義的組件,它是繼承 StatefulWidget 類的組件
有狀態(tài)組件聲明
class CustomWidget extends StatefulWidget {
@override
_CustomWidgetState createState() => _CustomWidgetState();
}
class _CustomWidgetState extends State<CustomWidget> {
@override
Widget build(BuildContext context) {
return Container(
);
}
}
和無狀態(tài)組件聲明還是有點(diǎn)區(qū)別要重寫 createState 方法并且重寫 State 的 build 方法來構(gòu)建界面
總之不管是無狀態(tài)組件還是有狀態(tài)組件都是通過重寫 build 方法來構(gòu)建界面的「至于底層是如何渲染界面的,后面專門開一篇來說」,以上兩種定義組件的基本骨架一定要把它記下
三、組件 Text & Image
1、文本組件 Text
先來個最簡單的組件文本組件--Text 可以定義一個文本并且聲明其顏色字體大小,顏色、對齊方式等樣式
Text 常用屬性
| 屬性 | 含義 |
|---|---|
| style | 文本的樣式 |
| textAlign | 文本的對齊方式 |
| textDirection | 文本的裝飾,比如下劃線等 |
| locale | 用于選擇區(qū)域特定字形的語言環(huán)境,很少使用 |
| softWrap | 是否自動換行,超出一行時設(shè)置 |
| overflow | 超出一行的處理方式,比如加...或是直接裁斷 |
| textScaleFactor | 文本縮放的倍率 |
| maxLines | 設(shè)置文本的最大行數(shù) |
| semanticsLabel | 圖像描述 |
Text 例子
(1)、普通文本
不廢話,先看效果

核心代碼

(2)、文本居左對齊「默認(rèn)方式」
效果圖

核心代碼

(3)、文本居右對齊
效果圖

核心代碼

(4)、文本樣式 style:TextStyle
(1)、字體顏色和文本大小 color/fontSize
效果圖

核心代碼

(2)、字體加粗 fontWeight:FontWeight.bold
效果圖

核心代碼

(3)、斜體字、字符間距、字或單詞間距「加空格才有效果」
效果圖

核心代碼

下面我們來看看文本裝飾器 decoration
(4)、decoration:TextDecoration.overline 文本上劃線
效果圖

PS: 線是直的,由于截圖問題所以看起來線不直
核心代碼

(5)、decoration:TextDecoration.lineThrough 文本刪除線
效果圖

核心代碼

(6)、decoration:TextDecoration.underline 文本下劃線
效果圖

核心代碼

(7)、decoration:TextDecoration.underline 文本下劃線,TextDecorationStyle.dashed:下劃線樣式為虛線
效果圖

核心代碼

到此我們就把 Text 組件大概說了一下,我們學(xué)習(xí)一個組件的時候,直接進(jìn)去看它的構(gòu)造方法就像查 API 一樣學(xué)習(xí),這樣就能掌握此組件了,當(dāng)然有的屬性我們沒有試,就留給讀者吧,下面我看看 Image 組件
2、圖片組件 Image
Image 的若干構(gòu)造方法
在一個應(yīng)用中除了文本之外使用最多的就是圖片組件了,上面說了,學(xué)習(xí)一個組件就是看它的構(gòu)造方法,不廢話我們直接看 Image() 的構(gòu)造方法
const Image({
Key key,
@required this.image,
this.frameBuilder,
this.loadingBuilder,
this.semanticLabel,
this.excludeFromSemantics = false,
this.width,
this.height,
this.color,
this.colorBlendMode,
this.fit,
this.alignment = Alignment.center,
this.repeat = ImageRepeat.noRepeat,
this.centerSlice,
this.matchTextDirection = false,
this.gaplessPlayback = false,
this.filterQuality = FilterQuality.low,
})
我們可以看到 Image 有眾多屬性,有寬、高、顏色、填充方式等等,我們知道圖片的來源有很多種,有來自本地圖片,有來自網(wǎng)絡(luò)圖片,有來自內(nèi)存的圖片,上面的構(gòu)造方法是從 ImageProvider 中加載圖片,什么是 ImageProvider 后面會說,根據(jù)以上說的圖片來源方式,Image 的構(gòu)造方法分為以下幾種:
- Image() 上面貼出了全部構(gòu)造方法參數(shù),從 ImageProvider 中加載圖片
- Image.asset() 從資源包資源目錄中加載本地圖片
- Image.network() 顧名思義從網(wǎng)絡(luò)加載圖片
- Image.file() 從文件中加載圖片
- Image.memory() 從 Uint8List「一個高效的 byte 數(shù)組存儲類,存儲圖片二進(jìn)制可以縮短轉(zhuǎn)換時間」 中加載圖片
其它的構(gòu)造方法就不貼出來了,有興趣可以仔細(xì)去看看
Image 例子
(1)、Image.asset()
在使用 Image.asset() 方法來加載本地資源目錄中「一般創(chuàng)建叫 assets 目錄,當(dāng)然可以叫別的名字」的圖片之前我們先要在項目根目錄下創(chuàng)建 assets 目錄

如圖所示創(chuàng)建 assets 目錄「當(dāng)然你可以直接在里面放進(jìn)圖片,也可以分別建立子目錄放圖片,不一定非要和我一樣創(chuàng)建 imgs/img 這樣的目錄,并且主目錄也不一定非叫 assets 」,這還沒完還要在 pubspec.yaml 文件中配置才可以使用
flutter: // 在此命令下面配置
assets: // 名字不能變
- assets/images/
- assets/images/image/
ps: 如果在 assets 目錄下有子目錄就要像上面配置先配置主目錄再配置子目錄,如果有多個目錄類似配置即可,使用的時候我可以使用 Image.asset('assets/imgs/img/xxx.png') 加載即可
為了方便,我們將圖片路徑定義成一個常量方便調(diào)用
const _PATH = "assets/imgs/img";
const _IMG04 = "$_PATH/img_04.png";
const _IMG06 = "https://xxx.yyy.zzz.jpg" ; // 網(wǎng)絡(luò)圖片
下面看看我們使用 Image.asset() 加載圖片的一個效果
效果圖

核心代碼

(2)、Image.network()
用法和 Image.asset() 一樣,只不過圖片的來源是網(wǎng)絡(luò)而已,直接看效果吧
效果圖

核心代碼

細(xì)心的朋友可能會發(fā)現(xiàn),我們給圖片設(shè)置和寬高都是 100 但是貌似沒有起什么作用,這就和我們接下來說的 fit 屬性有關(guān)系,如果不設(shè)置 fit 屬性就看不到設(shè)置的寬高效果。
(3)、Image fit 屬性
我們可以大概的看看源碼查看 fit 屬性 可以看到默認(rèn)的屬性是在 paintImage 中的

我們稍微看看 paintImage 的構(gòu)造方法,其中有 fit 的初始化操作

我們可以看到如果不設(shè)置 centerSlice 屬性那么默認(rèn)圖片的 fit 屬性是 BoxFit.scaleDown 類型的 centerSlice 是圖片的內(nèi)部拉升,一般是針對 .9 圖片的,至于 BoxFit.scaleDown 是什么樣式的我們后面會說,這下我們就了解了設(shè)置了寬高,但是沒有給 fit 屬性寬高就沒有起實際作用的原因了吧
(1)、Image fit 屬性
總的來說 fit 有以下屬性
- BoxFit.fill 全圖顯示,圖片會被拉升,并充滿父容器

- BoxFit.fitWidth 寬度充滿(橫向充滿),顯示可能拉伸,高度調(diào)試可能裁切。

- BoxFit.fitHeight 高度充滿(豎向充滿),顯示可能拉伸,寬度可能裁切

- BoxFit.cover 顯示可能拉伸,可能裁切,充滿(圖片要充滿整個容器,還不變形)。

- BoxFit.contain 全圖顯示,顯示原比例,可能會有空隙。

- BoxFit.scaleDown 效果和contain差不多,但是此屬性不允許顯示超過源圖片大小,可小不可大

- BoxFit.none 圖片居中顯示,不改變分大小,可能會被截斷。

(2)、Image fit 屬性實例
效果圖

可以看到我們把 fit 的所有屬性都羅列出來
核心代碼







這沒什么好說的,嘗試寫一下感受一下「代碼中我們用了大量的 Container 組件,它就相當(dāng)于 html 中的 Div 下節(jié)我們再具體的介紹」,我們在實際項目中開發(fā)中,還會遇到圓角圖片,圓形圖片等,接下來我們看看如何實現(xiàn)
(3)、Image 圓形、圓角圖片
實現(xiàn)圓形圖片不止一種方式,我們來看看有那些方式可以實現(xiàn)圓形圖片
圓形圖片
(1)、ClipOval、BoxDecoration 分別實現(xiàn)圓形圖片
ClipOval 圓形剪裁使用其可以實現(xiàn)圓形圖片,也可以使用 Container「下節(jié)我們具體介紹,這節(jié)先知道有這么個組件就好」 的盒子裝飾來實現(xiàn)圓形圖片,我們來看看效果圖
效果圖

核心代碼

(2)、CircleAvatar 現(xiàn)圓形圖片
從字面意思就可以看出來 CircleAvatar 是圓形頭像的意思,我們可以用其來設(shè)置圓形圖片,具體組件的構(gòu)造方法就不看了,下來了可以具體研究「要是把所有組件的構(gòu)造方法都說一遍,那就不要開發(fā)項目了,光看完所有組件都得幾個月」
效果圖

核心代碼

圓角圖片
同樣實現(xiàn)圓角圖片也有多種方式可以使用 ClipRRect「矩形裁剪」來實現(xiàn),也可以使用 Container 的 BoxDecoration 來實現(xiàn)
效果圖

核心代碼

使用 ClipRRect 其 borderRadius 就可以實現(xiàn)圓角圖片,當(dāng)然可以選擇性的設(shè)置四個角那個需要圓角

(3)、Image 的占位圖 FadeInImage 的 placeholder
我們在實際開發(fā)中可能會在顯示圖片之前添加一個默認(rèn)的圖片來占位,那么我們使用 FadeInImage 組件來完成,F(xiàn)adeInImage 組件圖片可以來自任何地方:內(nèi)存、本地,文件和網(wǎng)絡(luò),同樣 FadeInImage 有多個構(gòu)造方法「感興趣可以下去仔細(xì)看一下」
效果圖

在此 demo 中我們使用本地圖片做為 placeholder 占位圖,你可以試試其它的方式
核心代碼


(4)、Image 其它屬性
除了以上 Image 的屬性之外,還有 alignment、repeat、centerSlic、matchTextDirection 等屬性,有興趣的可以都試一下「這里不展開說了,只要學(xué)會方法即可,學(xué)一個組件就看其構(gòu)造方法,然后一個個的試看到結(jié)果自然就領(lǐng)會了」
四、總結(jié)
本節(jié)我們介紹了 Flutter 中最常見的兩個組件 Text 和 Image 分別介紹了它們的常見的用法,當(dāng)然沒有把每個屬性都介紹完,如果把每個屬性都介紹完,估計又得單獨(dú)再開一篇文章來說了,如果我們在使用的過程想知道組件的用法和屬性直接看其構(gòu)造方法就可以「就像查 API 一樣」,本節(jié)就到此為止,文中的代碼全部以圖片的形式給出就是為了讓大家動手敲一遍「后面整理完了會給出組件的 demo 源碼」,下節(jié)我們來說 Container 組件
作者: TigerChain 訂閱查看更多內(nèi)容,公號「TigerChain」同步
本文出自 TigerChain 的 從頭開始整 Flutter