轉(zhuǎn)自
創(chuàng)新互聯(lián)公司服務(wù)項目包括依蘭網(wǎng)站建設(shè)、依蘭網(wǎng)站制作、依蘭網(wǎng)頁制作以及依蘭網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,依蘭網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到依蘭省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
在 Flutter 中,有兩類常用的 Widget:
在開發(fā)過程中,我們經(jīng)常需要繼承它們兩來實現(xiàn)自己的 Widget。
一個 StatelessWidget 是不能被改變的,比如: Icon 、 Text 等。
如果你的控件一旦顯示,就不需要再做任何的變更,那么你應(yīng)該使用 StatelessWidget 。
實現(xiàn)一個自己的 StatelessWidget 很簡單。
當你看到下面這個例子?時,你就知道它有多簡單了。
看,只要在 build() 中返回你的視圖就可以了。
一個 StatefulWidget 是有狀態(tài)的,可變的。
它可以改變自己的外觀,以響應(yīng)用戶的操作或者數(shù)據(jù)的變化。
比如: CheckBox 、 Switch ..
我們之所以能夠改變一個 StatefulWidget ,是因為它有一個設(shè)置狀態(tài)的函數(shù):
調(diào)用這個函數(shù)后,就會觸發(fā) StatefulWidget 的視圖樹重建。
因此,當我們需要一個可交互的,即能根據(jù)用戶操作或數(shù)據(jù)變化而改變視圖的 Widget 時,那就得用上 StatelessWidget 了。
現(xiàn)在,來創(chuàng)建一個自定義的 StatefulWidget:
從上面的例子中可以看到, StatefulWidget 會要求提供一個含有視圖樹的 State 。
既然 State 能夠控制一個視圖的狀態(tài),那它肯定會有一系列的生命周期。
上圖就是 State 的生命周期圖。
一、前言
Flutter開發(fā),就需要對各種狀態(tài)的管理,就是在請求數(shù)據(jù)的時候需要實時變化,各種交互變化等,在沒有使用GetX之前使用Provider,用Provider的時候覺得真香,挺方便的,需要刷新的時候直接 notifyListeners(); 用了GetX之后覺得Provider太繁瑣了。這邊介紹下GetX的使用以及常用的方法。
二、 GetX
GetX 是 Flutter 上的一個輕量且強大的解決方案:高性能的狀態(tài)管理、智能的依賴注入和便捷的路由管理。
1、相關(guān)優(yōu)勢:
三、使用
1、第一步 引入get
2、第二步
修改入口、配置路由
3、路由
Routes類
Pages類
4、狀態(tài)管理
我一般一個page對應(yīng)一個controller, controller來處理邏輯,控制page.
簡單使用
5、依賴注入
依賴注入也是我喜歡的,可以減少很多工作。
第一步
第二步
6、跨頁面交互
7、黑暗模式
可以參考前期寫的博客。 黑暗模式的適配
Flutter有兩個常用的狀態(tài)類:
標記為dirty,執(zhí)行的markNeedsBuild,定義在Element類中:
當前Element節(jié)點被標記為dirty,同時調(diào)用owner的scheduleBuildFor方法:
將element元素添加到全局的“臟”鏈表里。
BuildOwner用來管理哪些需要更新的Widget。這個owner最開始被初始化的地方在WidgetsBinding的initInstances方法中,隨后初始化了onBuildScheduled方法,對應(yīng)執(zhí)行的是_handleBuildScheduled,定義在WidgetsBinding類中:
ensureVisualUpdate 方法定義在SchedulerBinding類中:
在提交下一幀繪制的時候會調(diào)用到scheduleFrame方法,提交給引擎繪制,看看scheduleFrame方法,也定義在SchedulerBinding類中:
提交給引擎繪制之后,會收到onDrawFrame的回調(diào),最終執(zhí)行到_handleDrawFrame方法中,對應(yīng)的是handleDrawFrame方法,定義在SchedulerBinding類中:
在RendererBinding的initInstances方法中添加了一個回調(diào)到這個List中,對應(yīng)的是RenderBinding的drawFrame方法,對應(yīng)的節(jié)點進行繪制渲染操作。
WidgetsBinding中的drawFrame方法:
看看這里的buildScope方法,定義在BuildOwner方法中。在上面 scheduleBuildFor 方法介紹中有提到:"scheduleBuildFor 是把一個 element 添加到 _dirtyElements 鏈表,以便當[WidgetsBinding.drawFrame]中調(diào)用 buildScope 的時候能夠重構(gòu) element。onBuildScheduled()是一個 BuildOwner 的回調(diào)"。在 drawFrame 中調(diào)用 buildOwner.buildScope(renderViewElement)更新 elements。
_dirtyElements列表在遍歷的過程中執(zhí)行rebuild方法,此時將所有標記為dirty的Element節(jié)點依次執(zhí)行rebuild,preformRebuild,build,updateChild,update方法,執(zhí)行界面更新。完成build,update操作完成之后,后續(xù)會將需要繪制的RenderObject添加到需要layout的列表中,等待繪制渲染。所有繪制完成之后將_dirtyElments列表清空,_inDirtyList標記位置為false。
提交給引擎繪制渲染
看看super.drawFrame(),這里就執(zhí)行到了RendererBinding類中,定義如下:
這里就是將最終需要繪制渲染的畫面提交給引擎的地方了,繪制完成之后就在界面顯示更新后的視圖了。
在默認情況下頁面切換走時會被銷毀,頁面切換回來時會被重新創(chuàng)建,如果頁面中有列表那么整個列表將會被重新創(chuàng)建,降低了用戶體驗,下面是解決這個問題的幾種處理方式
Flutter (二)布局
Flutter (三) 狀態(tài)管理
Flutter (四) Map轉(zhuǎn)模型
Flutter (五) 網(wǎng)絡(luò)請求
Flutter (六) 保留界面狀態(tài)
Flutter (七) 混合開發(fā) [配置]
Flutter (八) 混合開發(fā) [Flutter完整項目嵌入到原生]