哥哥帶你Flutter快速實戰(zhàn),步步緊逼

首先分清結(jié)構(gòu),主攻三大部分

一,基礎(chǔ)控件

1,tabbar控件實現(xiàn)

Scaffold + Appbar + Tabbar + PageView

2,上下刷新列表

Flutter 中 為我們提供了?RefreshIndicator?作為內(nèi)置下拉刷新控件;同時我們通過給?ListView?添加?ScrollController?做滑動監(jiān)聽,在最后增加一個 Item, 作為上滑加載更多的 Loading 顯示。

這里需要注意一點是:可以利用 GlobalKey<RefreshIndicatorState> 對外提供 RefreshIndicator 的 RefreshIndicatorState,這樣外部就 可以通過 GlobalKey 調(diào)用 globalKey.currentState.show();,主動顯示刷新狀態(tài)并觸發(fā) onRefresh 。

?上拉加載更多在代碼中是通過?_getListCount()?方法,在原本的數(shù)據(jù)基礎(chǔ)上,增加實際需要渲染的 item 數(shù)量給 ListView 實現(xiàn)的,最后通過?ScrollController?監(jiān)聽到底部,觸發(fā)?onLoadMore。

3,Loading框

默認系統(tǒng)提供了CircularProgressIndicator,但這里我要推薦一個第三方Loading庫,flutte_spinkit ,通過簡單的配置就可以使用豐富的Loading樣式。

4,矢量圖標庫

矢量圖標可以輕松定義顏色,任意調(diào)整大小不模糊,矢量圖標庫是引入ttf字體庫文件實現(xiàn),在flutter中通過icon控件,加載對應(yīng)的icondata顯示即可。這里推薦阿里巴巴的iconfont。

fonts: - asset: static/font/iconfont.ttf

5,路由跳轉(zhuǎn)

Flutter中頁面跳轉(zhuǎn)是通過navigator實現(xiàn)的,路由跳轉(zhuǎn)分為:帶參跳轉(zhuǎn)和不帶參跳轉(zhuǎn)。Navigator 的 push 返回的是一個?Future,這個Future?的作用是在頁面返回時被調(diào)用的。也就是你可以通過?Navigator?的?pop?時返回參數(shù),之后在?Future?中可以的監(jiān)聽中處理頁面的返回結(jié)果。

二,數(shù)據(jù)模塊

1,網(wǎng)絡(luò)請求

dio ,http ,httpclient

2,Json序列化

在Flutter中,json序列化是特殊的。比如使用dio網(wǎng)絡(luò)請求返回,如果配置了返回數(shù)據(jù)格式為json,實際上的收到的是一個map,而map使用不是很方便,所以需要再一次轉(zhuǎn)化,轉(zhuǎn)為實際的Model實體。

創(chuàng)建你的實體 Model 之后,繼承 Object 、然后通過?@JsonSerializable()?標記類名。

通過 with _$TemplateSerializerMixin,將 fromJson 方法委托到 Template.g.dart 的實現(xiàn)中。 其中 *.g.dart、_$* SerializerMixin、_$*FromJson 這三個的引入, 和 Model 所在的 dart 的文件名與 Model 類名有關(guān),具體可見代碼注釋和后面圖片。

最后通過?flutter packages pub run build_runner build?編譯自動生成轉(zhuǎn)化對象。

3,Redux State? ? --? ? flutter_redux

全局狀態(tài)管理器 -- 跨控件管理,同步state,比如把用戶信息存儲在?redux?的?store?中, 好處在于:?比如某個頁面修改了當前用戶信息,所有綁定的該 State 的控件將由 Redux 自動同步修改。State 可以跨頁面共享。

在redux中主要引入了action,reducer,store概念。

action 用于定義一個數(shù)據(jù)變化的請求。

reducer 用于根據(jù) action 產(chǎn)生新狀態(tài)

store 用于存儲和管理 state,監(jiān)聽 action,將 action 自動分配給 reducer 并根據(jù) reducer 的執(zhí)行結(jié)果更新 state。

Action 用于定義一個數(shù)據(jù)變化的請求行為。Reducer 用于根據(jù) Action 產(chǎn)生新狀態(tài),一般是一個方法。Store 用于存儲和管理 state。所以一般流程為:1、Widget 綁定了 Store 中的 state 數(shù)據(jù)。2、Widget 通過 Action 發(fā)布一個動作。3、Reducer 根據(jù) Action 更新 state。4、更新 Store 中 state 綁定的 Widget。

4,數(shù)據(jù)庫

按照 sqflite 文檔提供的方法,重新做了一小些修改,通過定義Provider操作數(shù)據(jù)庫:

在 Provider 中定義表名數(shù)據(jù)庫字段常量,用于創(chuàng)建表與字段操作;

提供數(shù)據(jù)庫與數(shù)據(jù)實體之間的映射,比如數(shù)據(jù)庫對象與User對象之間的轉(zhuǎn)化;

在調(diào)用 Provider 時才先判斷表是否創(chuàng)建,然后再返回數(shù)據(jù)庫對象進行用戶查詢。

三,其他功能

1,返回按鍵監(jiān)聽

? Flutter 中 ,通過WillPopScope?嵌套,可以用于監(jiān)聽處理 Android 返回鍵的邏輯。其實?WillPopScope?并不是監(jiān)聽返回按鍵,如名字一般,是當前頁面將要被pop時觸發(fā)的回調(diào)。

2,前后臺監(jiān)聽

?WidgetsBindingObserver?包含了各種控件的生命周期通知,其中的?didChangeAppLifecycleState?就可以用于做前后臺狀態(tài)監(jiān)聽。

3,鍵盤焦點處理

一般觸摸收起鍵盤也是常見需求,如下代碼所示,?GestureDetector?+?FocusScope?可以滿足這一需求。

4,雙端啟動頁

三,重點挖掘

1,Mixins

Mixin 能夠更好的解決多繼承中容易出現(xiàn)的問題,如:方法優(yōu)先順序混亂、參數(shù)沖突、類結(jié)構(gòu)變得復(fù)雜化等等。

2,WidgetsFlutterBinding

WidgetsFlutterBinding?在 Flutter啟動時runApp會被調(diào)用,作為App的入口,它肯定需要承擔各類的初始化以及功能配置,這種情況下,Mixins 的作用就體現(xiàn)出來了。

3,inheriedWidget

InheritedWidget?是一個抽象類,在 Flutter 中扮演者十分重要的角色,或者你并未直接使用過它,但是你肯定使用過和它相關(guān)的封裝。

InheritedWidget主要實現(xiàn)兩個方法:

創(chuàng)建了InheritedElement,該Element屬于特殊 Element,? 主要增加了將自身也添加到映射關(guān)系表_inheritedWidgets【注1】,方便子孫 element 獲取;同時通過notifyClients方法來更新依賴。

增加了updateShouldNotify方法,當方法返回 true 時,那么依賴該 Widget 的實例就會更新。

所以我們可以簡單理解:InheritedWidget 通過InheritedElement實現(xiàn)了由下往上查找的支持(因為自身添加到_inheritedWidgets),同時具備更新其子孫的功能。

注1:每個 Element 都有一個_inheritedWidgets,它是一個?HashMap<Type, InheritedElement>,它保存了上層節(jié)點中出現(xiàn)的?InheritedWidget?與其對應(yīng) element 的映射關(guān)系。

接著我們看BuildContext,如上圖,BuildContext其實只是接口,Element實現(xiàn)了它。InheritedElement是Element的子類,所以每一個 InheritedElement 實例是一個 BuildContext 實例。同時我們?nèi)粘J褂弥袀鬟f的 BuildContext 也都是一個 Element 。

所以當我們遇到需要共享 State 時,如果逐層傳遞 state 去實現(xiàn)共享會顯示過于麻煩,那么了解了上面的InheritedWidget之后呢?

是否將需要共享的 State,都放在一個 InheritedWidget 中,然后在使用的 widget 中直接取用就可以呢?答案是肯定的!所以如下方這類代碼:通常如焦點、主題色、多語言、用戶信息等都屬于 App 內(nèi)的全局共享數(shù)據(jù),他們都會通過 BuildContext(InheritedElement) 獲取。

綜上所述,我們從先Theme入手。

如下方代碼所示,通過給MaterialApp設(shè)置主題數(shù)據(jù),通過Theme.of(context)就可以獲取到主題數(shù)據(jù)并綁定使用。當MaterialApp的主題數(shù)據(jù)變化時,對應(yīng)的 Widget 顏色也會發(fā)生變化,這是為什么呢(?`?Д?′)!!?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,488評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,034評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,327評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,554評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,337評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 54,883評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,975評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,114評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,625評論 1 332
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,555評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,737評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,244評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 43,973評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,362評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,615評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,343評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,699評論 2 370