Flutter Dio源碼分析(一)--Dio介紹

從事成都西信服務器托管,服務器租用,云主機,網絡空間,國際域名空間,CDN,網絡代維等服務。
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 庫的時候,我們可以隨時方便切換到別的網絡請求庫,當然 Dio 目前內置支持使用第三方庫的適配器。
因為一個應用程序基本都是統(tǒng)一的配置方式,所以我們可以針對 攔截器 、 轉換器 、 緩存 、 統(tǒng)一處理錯誤 、 代理配置 、 證書校驗 等多個配置進行統(tǒng)一管理。
因為我們的應用程序在每個頁面中都會用到網絡請求,那么如果我們每次請求的時候都去實例化一個 Dio ,無非是增加了系統(tǒng)不必要的開銷,而使用單例模式對象一旦創(chuàng)建每次訪問都是同一個對象,不需要再次實例化該類的對象。
這是通過靜態(tài)變量的私有構造器來創(chuàng)建的單例模式
我們對 超時時間 、 響應時間 、 BaseUrl 進行統(tǒng)一設置
因為不管是 get() 還是 post() 請求, Dio 內部最終都會調用 request 方法,只是傳入的 method 不一樣,所以我們這里定義一個枚舉類型在一個方法中進行處理
我們已經把 Restful API 風格簡化成了一個方法,通過 DioMethod 來標明不同的請求方式。在我們平時開發(fā)的過程中,需要在請求前、響應前、錯誤時對某一些接口做特殊的處理,那我們就需要用到攔截器。 Dio 為我們提供了自定義攔截器功能,很容易輕松的實現(xiàn)對請求、響應、錯誤時進行攔截
我們發(fā)現(xiàn)雖然 Dio 框架已經封裝了一個 DioError 類庫,但如果需要對返回的錯誤進行統(tǒng)一彈窗處理或者路由跳轉等就只能自定義了
在我們發(fā)送請求的時候會碰到幾種情況,比如需要對非open開頭的接口自動加上一些特定的參數,獲取需要在請求頭增加統(tǒng)一的 token
在我們請求接口前可以對響應數據進行一些基礎的處理,比如對響應的結果進行自定義封裝,還可以針對單獨的 url 做特殊處理等。
我們看了轉換器的介紹,發(fā)現(xiàn)和攔截器的功能差不多,那為什么還要存在轉換器,有兩點:
執(zhí)行流程: 請求攔截器 請求轉換器 發(fā)起請求 響應轉換器 響應攔截器 最終結果 。
只會被用于 'PUT'、 'POST'、 'PATCH'方法,因為只有這些方法才可以攜帶請求體(request body)
會被用于所有請求方法的返回數據。
在開發(fā)過程中,客戶端和服務器打交道的時候,往往會用一個 token 來做校驗,因為每個公司處理刷新token的邏輯都不一樣,我這里舉一個簡單的例子
為什么我們需要有取消請求的功能,如果當我們的頁面在發(fā)送請求時,用戶主動退出當前界面或者app應用程序退出的時候數據還沒有響應,那我們就需要取消該網絡請求,防止不必要的錯誤。
由 服務器生成 的 一小段文本信息 ,發(fā)送給瀏覽器,瀏覽器把 cookie 以kv形式保存到本地 某個目錄下的文本文件內,下一次請求同一網站時會把該 cookie 發(fā)送給服務器。
cookie 的使用需要用到兩個第三方組件 dio_cookie_manager 和 cookie_jar
因為在我們平時的開發(fā)過程中,會碰到一種情況,在進行網絡請求時,我們希望能正常訪問到上次的數據,對于用戶的體驗比較好,而不是展示一個空白的頁面,該緩存主要是 《Flutter實戰(zhàn)》網絡接口緩存 提供參考。
我們在程序退出后內存緩存將會消失,所以我們用 shared_preferences 進行磁盤緩存數據。
在我們用flutter進行抓包的時候需要配置 Dio 代理。由 DefaultHttpClientAdapter 提供了一個 onHttpClientCreate 回調來設置底層 HttpClient 的代理。
用于驗證正在訪問的網站是否真實。提供安全性,因為證書和域名綁定,并且由根證書機構簽名確認。
日志打印主要是幫助我們開發(fā)時進行輔助排錯
如果和我一樣,用慣了VS Code來開發(fā)項目的話,那就跟我一起來配置一下如何在VS Code里運行flutter項目。
1.在VS Code里安裝擴展:
2.在VScode上打開打開終端,快捷鍵:Ctrl+~(Tab上一個鍵),在終端上輸入:flutter create flutter_app02,即可創(chuàng)建完成!
也可以把之前的項目放到工作區(qū)
3.在終端中運行命令:flutter run
運行的時候你會發(fā)現(xiàn)手機提示你安裝個app,點擊安裝完成,項目就在手機上顯示了,下圖是運行成功的提示。
下圖是手機效果:
如果報錯的話,運行下清緩存的命令:flutter clean,把文件夾.gradle刪掉,然后flutter run重新跑下項目。
準備寫這一系列的文章自己是下了很大的決心的,自知會遇到很大的困難。因能力有限,如有疏漏之處,還請大家斧正。
相信大家都看過很多遍下面那張圖,這個系列的文章就是要分析紅框內的源碼:
我們看源碼的結構其實是這樣的:
總共十二個模塊,對應的模塊我一旦寫完就會在下面更新鏈接:
最近一個項目要實現(xiàn)可以無限循環(huán)的PageView,主要思路是在初始化pageview的list的時候在開始和結尾多加一個結尾和開頭的widget,當滑動到開頭和結尾的時候手動進行頁面的切換,詳細可以搜索pageview無限輪播。
這種方法有一個要點就是要維護兩個索引,一個是內部list的索引,一個是外部顯示的索引,由于list的容量是比顯示的數量多2的,所以如果要在外部進行一些比如指示器或者計時器功能要進行和頁面同步顯示或者切換頁面操作時,需要將顯示的索引轉換成list的索引。
不過網上說的都是一些比較簡單的實現(xiàn),看到比較多的就是當滑動到要手動切換的時候進行一個時延,這樣可以避免直接切換頁面造成的卡頓和跳動現(xiàn)象。但是存在一個問題,如果要同時實現(xiàn)一個跟隨頁面切換的指示器,就會出現(xiàn)當頁面切換過去之后指示器才會跟著過去,因為頁面切換的時候執(zhí)行了時延,而時延之后才會真正改變索引,此時才會setstate,之后指示器才能響應到索引的切換,但是如果在時延之前就切換的話又會出現(xiàn)指示器先行的情況。因此這種方法其實是存在一些問題的。
所以解決這個問題的關鍵在于如何進行頁面切換的判斷。這里可以有兩種思路實現(xiàn),第一種是實現(xiàn)viewpage的onpagechanged方法,在里面進行邏輯的判斷,然后用controller來進行頁面跳轉,不過這種方法存在當controller跳轉的時候又會回調onpagechanged,所以就會出現(xiàn)多次對索引不必要操作,而且如果有比如計時器等額外的功能的話可能不方便將頁面邏輯分開,而且依舊無法解決指示器延遲問題,同時也很難進行細粒度的操作。
第二種方法我們就要去看pageview的源碼了,從源碼的角度來解決問題才是正確的方法。首先我們點進去pageview的源碼
看到這里其實已經有一些思路了,我們之前難點在于重寫了onpagechanged方法導致問題無法很好的解決,現(xiàn)在我們找到了onpagechanged調用的地方,只要找辦法避免掉就可以實現(xiàn)了。
當然這里我們要說到NotificationListener,以及flutter對應的冒泡事件傳輸機制,這里大家可以去看看這篇 文章 。
我來總結一下,其實就是flutter對于notification這個組件,有一中事件規(guī)則叫冒泡傳遞,底層的notification如果在它的 onNotification寫的邏輯中返回是false以及它不是根結點,就會去向上遍歷尋找它的祖先notification組件,知道遇到root節(jié)點或者某一個返回true,則事件傳遞結束。
而且在onNotification中可以對多種事件進行監(jiān)聽和處理,所以我們可以把對viewpage頁面跳轉對索引處理的邏輯寫在這里,而且我們可以分別處理比如滑動開始的start事件和結束的end事件,分別進行細粒度的邏輯的處理,這樣就可以在外部進行操作和別的功能實現(xiàn)了。
因此不僅無限輪播事件可以通過這種方法來解決,如果有其他的操作也可以這樣進行處理,而且因為我們沒有傳入onpagechanged方法,所以不存在多次調用的問題,pageview那里判斷onpagechanged是null方法就不會進去了,會直接我們寫在pageview外面的notification的邏輯。
最后的結構大概這樣
本文標題:flutter項目源代碼,flutter開發(fā)教程
分享地址:http://chinadenli.net/article45/dsgpoei.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站建設、定制網站、網站收錄、移動網站建設、全網營銷推廣、定制開發(fā)
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)