? ? ? ? ? ? ? ? ? ? ? ? ? ?Flutter生命周期? :
和其他框架中視圖比如Android的Activity一樣南蓬,flutter中的視圖Widget也存在生命周期汗唱,生命周期的回調(diào)函數(shù)體現(xiàn)在了State上面献起,理解flutter的生命周期顾稀,對(duì)我們寫一個(gè)合理的控件至關(guān)重要歧胁。組件State生命周期整理如下:
?initState,? ?didChangeDependencies,? ?bulid,? ?reassemble,? ?didUpdateWidget,? ?deactivate,? ?dispose舟肉,
其實(shí)總結(jié)下來大致可以分為三個(gè)階段,初始化(插入渲染樹)曙求,狀態(tài)改變(在渲染樹中存在)碍庵,銷毀(從渲染樹中移除)
initstate:
其實(shí)這個(gè)函數(shù)不屬于生命周期,因?yàn)檫@個(gè)時(shí)候state的widget屬性還是空的悟狱,如果在構(gòu)造函數(shù)中訪問widget屬性是行不通的,但是構(gòu)造函數(shù)必然是第一個(gè)要調(diào)用的堰氓。當(dāng)插入渲染樹的時(shí)候調(diào)用挤渐,這個(gè)函數(shù)在生命周期中值調(diào)用一次,這里可以做一些初始化工作双絮,比如初始化state的變量浴麻。
didChangeDependencies:
這個(gè)函數(shù)會(huì)緊跟在initState之后調(diào)用,并且可以調(diào)用BuildContext.inherFromWidgetOfExactType,那么BuildContext.inheritFromWidgetOfExactType的使用場(chǎng)景是什么呢囤攀?最經(jīng)典的應(yīng)用場(chǎng)景是软免?
didUpdateWidget
當(dāng)組件狀態(tài)改變的時(shí)候回調(diào)用didUpdateWidget,比如調(diào)用了setState,實(shí)現(xiàn)上這里flutter框架回創(chuàng)建一個(gè)新的Widget,綁定State焚挠,并在這個(gè)函數(shù)中傳遞老的Widget膏萧,這個(gè)函數(shù)一般用于比較新、老Widget,看看那些屬性改變了蝌衔,并對(duì)State做出一些調(diào)整榛泛。需要注意的是,涉及controller的變更噩斟,需要在這個(gè)函數(shù)中移除老的controller的監(jiān)聽曹锨,并才創(chuàng)建新的controller監(jiān)聽。比如tabbar:
deactivate
在dispose之前剃允,會(huì)調(diào)用這個(gè)函數(shù)沛简。
dispose
一旦到這個(gè)階段,組件就要被銷毀了斥废,這個(gè)函數(shù)一般是移除監(jiān)聽椒楣,清理環(huán)境。??
概念認(rèn)識(shí)
1营袜,State
1撒顿,widget build時(shí)被讀取
2,在widget生命周期中被改變荚板,當(dāng)state被改變時(shí)凤壁,可以手動(dòng)調(diào)用setstate方法通知flutter狀態(tài)發(fā)生改變吩屹,fromework在收到消息后,會(huì)重新調(diào)用build方法重新構(gòu)建widget樹拧抖,從而達(dá)到更新UI的目的煤搜。
兩個(gè)常用屬性:
1,widget state只會(huì)在第一次插入到樹種時(shí)被創(chuàng)建唧席。,
2擦盾,Context它是buildcontext 一個(gè)實(shí)例,每個(gè)widget都有自己的context對(duì)象淌哟。
2迹卢,Text
maxLines、overflow:指定文本顯示的最大行數(shù)徒仓,默認(rèn)情況下腐碱,文本是自動(dòng)折行的,如果指定此參數(shù)掉弛,則文本最多不會(huì)超過指定的行症见。如果有多余的文本,可以通過overflow來指定截?cái)喾绞窖甓觯J(rèn)是直接截?cái)嗄弊鳎纠兄付ǖ慕財(cái)喾绞絋extOverflow.ellipsis,它會(huì)將多余文本截?cái)嗪笠允÷苑?..”表示乎芳;TextOverflow的其它截?cái)喾绞秸?qǐng)參考SDK文檔遵蚜。
textScaleFactor:代表文本相對(duì)于當(dāng)前字體大小的縮放因子,相對(duì)于去設(shè)置文本的樣式style屬性的fontSize秒咐,它是調(diào)整字體大小的一個(gè)快捷方式谬晕。該屬性的默認(rèn)值可以通過MediaQueryData.textScaleFactor獲得,如果沒有MediaQuery携取,那么會(huì)默認(rèn)值將為1.0攒钳。
TextSpan : Text其實(shí)就是RichText的一個(gè)包裝,而RichText是可以顯示多種樣式(富文本)的widget雷滋。_tapRecognizer不撑,它是點(diǎn)擊鏈接后的一個(gè)處理器(代碼已省略),關(guān)于手勢(shì)識(shí)別的更多內(nèi)容我們將在后面單獨(dú)介紹晤斩。
3,Button
4,圖片和Icon
ImageProvider?是一個(gè)抽象類焕檬,主要定義了圖片數(shù)據(jù)獲取的接口load(),從不同的數(shù)據(jù)源獲取圖片需要實(shí)現(xiàn)不同的ImageProvider?澳泵,如AssetImage是實(shí)現(xiàn)了從Asset中加載圖片的ImageProvider实愚,而NetworkImage實(shí)現(xiàn)了從網(wǎng)絡(luò)加載圖片的ImageProvider。
5,單選框和復(fù)選框
6击喂,輸入框和表單
7,線性布局Row碰辅、Colum
8懂昂,彈性布局Flex
9,流式布局 wrap ,Flow
10凌彬,層疊布局 Stack Postioned? 就像安卓中的Framelayout 允許堆疊
11,Padding
12循衰,布局限制類容器ConstrainedBox和SizedBox
13铲敛,DecoratedBox
14,Transform變換
15,container
16会钝,Scaffold 原探,tabBar,底部導(dǎo)航
17,SingleChildScrollview
18顽素,Listview
19,Gridview
20,滾動(dòng)監(jiān)聽以及控制ScrollController
21全蝶,導(dǎo)航返回WillPopScope
22,數(shù)據(jù)共享
23寺枉,主題
23抑淫,Pointer事件處理
24,手勢(shì)識(shí)別
25筐喳,事件總線
26催式,Notification
Notification 會(huì)沿著當(dāng)前節(jié)點(diǎn)向上傳遞,多有父節(jié)點(diǎn)都可以通過NotificationListener來監(jiān)聽通知避归。這種由子向父的傳遞為通知冒泡荣月。
27,通過組合現(xiàn)有Widget實(shí)現(xiàn)自定義
28梳毙,CustomPaint與Canvas
29哺窄,Http請(qǐng)求
30,網(wǎng)絡(luò)操作 Dio http庫
dio是一個(gè)強(qiáng)大的Dart Http請(qǐng)求庫,支持Restful API萌业、FormData坷襟、攔截器、請(qǐng)求取消咽白、Cookie管理啤握、文件上傳/下載、超時(shí)等晶框。