十年網(wǎng)站開發(fā)經(jīng)驗 + 多家企業(yè)客戶 + 靠譜的建站團隊
量身定制 + 運營維護+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
閑來有空,升級了新的SDK版本,之前舊的組件不再可用,封裝一個全新支持Dart“nullsafety”空安全特性、更加簡單易用的ListView組件。
創(chuàng)新互聯(lián)是專業(yè)的遂昌網(wǎng)站建設(shè)公司,遂昌接單;提供成都做網(wǎng)站、成都網(wǎng)站設(shè)計、成都外貿(mào)網(wǎng)站建設(shè),網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行遂昌網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
利用NotificationListener的監(jiān)聽事件實現(xiàn)Pull up load more。
利用RefreshIndicator組件實現(xiàn)Pull down refresh。
已開源上傳至GITHUB,歡迎Star、Fork。
在 Flutter 中定時器相對 iOS 來說比較好的一點就是定時器事件的執(zhí)行不會受視圖拖拽的影響,不涉及到模式。但是需要注意一點的是在頁面離開的時候要對定時器進行銷毀。
開始的時候我們是在頁面中直接使用三方框架 http 進行網(wǎng)絡(luò)的請求,這里不好的一點就是如果將來我們更換了網(wǎng)絡(luò)請求框架的話,項目中涉及到網(wǎng)絡(luò)的請求的地方都需要改動,對項目的影響會比較大。所以這里我們自己封裝了一個網(wǎng)絡(luò)請求類,定義自己的網(wǎng)絡(luò)請求方法,即使將來更換三方框架的話,我們只需要在我們自己網(wǎng)絡(luò)請求類里面更換就好,項目的其他地方不用改動。對網(wǎng)絡(luò)請求進行封裝,相信不管是 iOS 項目還是安卓項目肯定也都是這樣做的。
這里我們是基于 Dio 這個三方框架進行封裝的,在 HttpManager 類中我們定義了 Dio 的單例對象 _dioInstance ,通過單例方法 _getDioInstance 來獲取單例對象。我們定義了 post 跟 get 兩個靜態(tài)方法,在這兩個方法中我們都調(diào)用了私有方法 _sendRequest , _sendRequest 方法中通過該傳入的枚舉參數(shù) HttpMethod 來區(qū)分 Dio 單例對象是調(diào)用 get 還是 post 請求。這里需要注意的是方法中一定要使用 async ,返回值前要加 await 。
在聊天頁面中我們可以看到頂部的搜索框,這個搜索框是跟列表一起滾動的,所以比較好的實現(xiàn)方式就是把搜索框定義為一個 cell 。其實這個搜索框只有點擊事件,點擊之后跳轉(zhuǎn)一個新的頁面,所以我們只需要使用小部件來實現(xiàn)搜索框的展示就好。搜索框由白色底視圖跟圖片和文本組成,所以這里我們通過 Stack 部件來實現(xiàn), children 的第一個元素為白色底視圖,圖片跟搜索文字用 Row 部件來實現(xiàn),圖片跟文字布局左右排列。
直接進入正題
新建一個NetworkTool工具類,下面是適配了Dart空安全的寫法
接下來我們來測試一下,是不是同個實例,用 identical(Object a, Object b) ,如果a和b是同一個實例,則會返回true,否則返回false;
結(jié)果如下:
可以看出來,我們單例的寫法沒有什么問題,不管是調(diào)用getter方法 NetworkTool.instance ,還是調(diào)用工廠構(gòu)造方法 NetworkTool() ,創(chuàng)建出來的實例都是同一個。
我們來封裝一下Dio這個http請求庫,只作簡單的演示
外面的使用如下:
結(jié)果當然也是返回true;
使用如下:
希望看完此文章后,小伙伴們自己可以寫出單例出來, 至少見到其他人的單例寫法,心里不慌,完全看得懂,hold得??!
小伙伴們,今天的分享至此結(jié)束! 如果小伴們,覺得有點用的話,或者已經(jīng)看到這里面來的請加關(guān)注及點個贊吧~~ 后續(xù)會分享更多有關(guān)flutter的文章。如果有疑問的話,請在下方留言~
Flutter Dio源碼分析(一)--Dio介紹
Flutter Dio源碼分析(二)--HttpClient、Http、Dio對比
Flutter Dio源碼分析(三)--深度剖析
Flutter Dio源碼分析(四)--封裝
Flutter Dio源碼分析(一)--Dio介紹視頻教程
Flutter Dio源碼分析(二)--HttpClient、Http、Dio對比視頻教程
Flutter Dio源碼分析(三)--深度剖析視頻教程
Flutter Dio源碼分析(四)--封裝視頻教程
github倉庫地址
本文會手把手教你該怎么去封裝一個類庫,平時在我們的工作中都是拿著別人的造好的輪子在使用,這篇文章將帶你怎么去自己造輪子,以后再碰到別的類庫需要對其進行封裝的時候提供一個的思路和方法。
在前面的文章中,我們對 Dio 的基本使用、請求庫對比、源碼分析,我們知道 Dio 的使用非常的簡單,那為什么還需要進行封裝呢?有兩點如下:
當組件庫方法發(fā)生重要改變需要遷移的時候如果有多處地方用到,那么需要對使用到的每個文件都進行修改,非常的繁瑣而且很容易出問題。
當不需要 Dio 庫的時候,我們可以隨時方便切換到別的網(wǎng)絡(luò)請求庫,當然 Dio 目前內(nèi)置支持使用第三方庫的適配器。
因為一個應(yīng)用程序基本都是統(tǒng)一的配置方式,所以我們可以針對 攔截器 、 轉(zhuǎn)換器 、 緩存 、 統(tǒng)一處理錯誤 、 代理配置 、 證書校驗 等多個配置進行統(tǒng)一管理。
因為我們的應(yīng)用程序在每個頁面中都會用到網(wǎng)絡(luò)請求,那么如果我們每次請求的時候都去實例化一個 Dio ,無非是增加了系統(tǒng)不必要的開銷,而使用單例模式對象一旦創(chuàng)建每次訪問都是同一個對象,不需要再次實例化該類的對象。
這是通過靜態(tài)變量的私有構(gòu)造器來創(chuàng)建的單例模式
我們對 超時時間 、 響應(yīng)時間 、 BaseUrl 進行統(tǒng)一設(shè)置
因為不管是 get() 還是 post() 請求, Dio 內(nèi)部最終都會調(diào)用 request 方法,只是傳入的 method 不一樣,所以我們這里定義一個枚舉類型在一個方法中進行處理
我們已經(jīng)把 Restful API 風格簡化成了一個方法,通過 DioMethod 來標明不同的請求方式。在我們平時開發(fā)的過程中,需要在請求前、響應(yīng)前、錯誤時對某一些接口做特殊的處理,那我們就需要用到攔截器。 Dio 為我們提供了自定義攔截器功能,很容易輕松的實現(xiàn)對請求、響應(yīng)、錯誤時進行攔截
我們發(fā)現(xiàn)雖然 Dio 框架已經(jīng)封裝了一個 DioError 類庫,但如果需要對返回的錯誤進行統(tǒng)一彈窗處理或者路由跳轉(zhuǎn)等就只能自定義了
在我們發(fā)送請求的時候會碰到幾種情況,比如需要對非open開頭的接口自動加上一些特定的參數(shù),獲取需要在請求頭增加統(tǒng)一的 token
在我們請求接口前可以對響應(yīng)數(shù)據(jù)進行一些基礎(chǔ)的處理,比如對響應(yīng)的結(jié)果進行自定義封裝,還可以針對單獨的 url 做特殊處理等。
我們看了轉(zhuǎn)換器的介紹,發(fā)現(xiàn)和攔截器的功能差不多,那為什么還要存在轉(zhuǎn)換器,有兩點:
執(zhí)行流程: 請求攔截器 請求轉(zhuǎn)換器 發(fā)起請求 響應(yīng)轉(zhuǎn)換器 響應(yīng)攔截器 最終結(jié)果 。
只會被用于 'PUT'、 'POST'、 'PATCH'方法,因為只有這些方法才可以攜帶請求體(request body)
會被用于所有請求方法的返回數(shù)據(jù)。
在開發(fā)過程中,客戶端和服務(wù)器打交道的時候,往往會用一個 token 來做校驗,因為每個公司處理刷新token的邏輯都不一樣,我這里舉一個簡單的例子
為什么我們需要有取消請求的功能,如果當我們的頁面在發(fā)送請求時,用戶主動退出當前界面或者app應(yīng)用程序退出的時候數(shù)據(jù)還沒有響應(yīng),那我們就需要取消該網(wǎng)絡(luò)請求,防止不必要的錯誤。
由 服務(wù)器生成 的 一小段文本信息 ,發(fā)送給瀏覽器,瀏覽器把 cookie 以kv形式保存到本地 某個目錄下的文本文件內(nèi),下一次請求同一網(wǎng)站時會把該 cookie 發(fā)送給服務(wù)器。
cookie 的使用需要用到兩個第三方組件 dio_cookie_manager 和 cookie_jar
因為在我們平時的開發(fā)過程中,會碰到一種情況,在進行網(wǎng)絡(luò)請求時,我們希望能正常訪問到上次的數(shù)據(jù),對于用戶的體驗比較好,而不是展示一個空白的頁面,該緩存主要是 《Flutter實戰(zhàn)》網(wǎng)絡(luò)接口緩存 提供參考。
我們在程序退出后內(nèi)存緩存將會消失,所以我們用 shared_preferences 進行磁盤緩存數(shù)據(jù)。
在我們用flutter進行抓包的時候需要配置 Dio 代理。由 DefaultHttpClientAdapter 提供了一個 onHttpClientCreate 回調(diào)來設(shè)置底層 HttpClient 的代理。
用于驗證正在訪問的網(wǎng)站是否真實。提供安全性,因為證書和域名綁定,并且由根證書機構(gòu)簽名確認。
日志打印主要是幫助我們開發(fā)時進行輔助排錯