FadeInImage官方默認(rèn)只支持緩存到內(nèi)存中,在項(xiàng)目中一般都需要把圖片緩存到本地文件中
成都創(chuàng)新互聯(lián)專注于定南網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供定南營銷型網(wǎng)站建設(shè),定南網(wǎng)站制作、定南網(wǎng)頁設(shè)計、定南網(wǎng)站官網(wǎng)定制、小程序制作服務(wù),打造定南網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供定南網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
通過觀察 FadeInImage 的構(gòu)造函數(shù)中,得知 image 是調(diào)用 ResizeImage.resizeIfNeeded(imageCacheWidth, imageCacheHeight, NetworkImage(image, scale: imageScale)) 這個方法來獲得圖片的,而獲得 ImageProvider 又是通過 NetworkImage(image, scale: imageScale)
繼續(xù)跟進(jìn)發(fā)現(xiàn) NetworkImage 是繼承 ImageProvider 的一個抽象類,里面有個工廠構(gòu)造函數(shù)
通過修改這里的源碼來實(shí)現(xiàn)本地緩存圖片
在這之前需要先導(dǎo)入
其中,參數(shù) image 類型為抽象類 ImageProvider ,定義了圖片數(shù)據(jù)獲取和加載的相關(guān)接口。
根據(jù)不同的數(shù)據(jù)來源,派生出不同的 ImageProvider :
抽象類 ImageProvider 提供了一個用于加載數(shù)據(jù)源的抽象方法 @protected ImageStreamCompleter load(T key, DecoderCallback decode); 接口,不同的數(shù)據(jù)源定義各自的實(shí)現(xiàn)。
子類 NetworkImage 實(shí)現(xiàn)如下:
load 方法返回類型為抽象類 ImageStreamCompleter ,其中定義了一些管理圖片加載過程的接口,比如 addListener 、 removeListener 、 addOnLastListenerRemovedCallback 等, MultiFrameImageStreamCompleter 為其子類。
MultiFrameImageStreamCompleter 第一個參數(shù) codec 類型為 Futureui.Codec ,用來對突破進(jìn)行解碼,當(dāng) codec 準(zhǔn)備好的時候,就會立即對圖片第一幀進(jìn)行解碼操作。
codec 為 _loadAsync 方法返回值,
_loadAsync 方法實(shí)現(xiàn):
decode 方法的類型:
其中解碼傳入的回調(diào)方法 image_provider.DecoderCallback decode ,
傳入 Uint8List ,返回 Futureui.Codec 。
而對 decode 回調(diào)方法的具體定義,在 ImageProvider 的 resolveStreamForKey 方法中做了定義, resolveStreamForKey 方法在 ImageProvider 的 resolve 方法中有調(diào)用, resolve 方法則為 ImageProvider 類層級結(jié)構(gòu)的公共入口點(diǎn)。
resolveStreamForKey 和 resolve 實(shí)現(xiàn)如下:
decode 方法,即 PaintingBinding.instance!.instantiateImageCodec ,即為具體圖片解碼的方法實(shí)現(xiàn)。
ui.instantiateImageCodec 實(shí)現(xiàn):
descriptor.instantiateCodec 方法實(shí)現(xiàn):
_instantiateCodec 方法的實(shí)現(xiàn),最終到了 native 的實(shí)現(xiàn):
其中返回值類型 Codec 里定義了一些屬性:
obtainKey 方法:
ImageProvider 定義了一個抽象方法 FutureT obtainKey(ImageConfiguration configuration); ,供子類來實(shí)現(xiàn),其中 NetworkImage 的實(shí)現(xiàn)為:
obtainKey 作用:
配合實(shí)現(xiàn)圖片緩存, ImageProvider 從數(shù)據(jù)源加載完數(shù)據(jù)后,會在 ImageCache 中緩存圖片數(shù)據(jù),圖片數(shù)據(jù)緩存時一個 Map ,其中 Map 中的 key 便是 obtainKey 。
resolve 作為 ImageProvider 提供給 Image 的主入口方法,參數(shù)為 ImageConfiguration ,
resolve 其中調(diào)用了 _createErrorHandlerAndKey 方法,設(shè)置了成功回調(diào)和失敗回調(diào):
其中 _createErrorHandlerAndKey 方法的實(shí)現(xiàn),便調(diào)用了 obtainKey 來設(shè)置 key 。
在成功回調(diào)里,調(diào)用了方法 resolveStreamForKey ,里面有具體的緩存實(shí)現(xiàn) PaintingBinding.instance!.imageCache!.putIfAbsent :
PaintingBinding.instance!.imageCache 是ImageCache的一個實(shí)例,是 PaintingBinding 的一個屬性,是一個單例,圖片緩存是全局的。
如上述判斷:
ImageCache 定義:
ImageCache 緩存池:
在 NetworkImage 中,對 ImageProvider 的抽象方法 obtainKey 進(jìn)行了實(shí)現(xiàn),將自己創(chuàng)建了一個同步 Future 進(jìn)行返回:
同時,自身又重寫了 ImageProvider 定義的 == 比較操作符,通過圖片 url 和圖片的縮放比例 scale 進(jìn)行比較:
通過ImageCache提供的方法來設(shè)置:
一. flutter中我們想加載本地圖片,需要兩步:
二. flutter項(xiàng)目中本地圖片加載的原理
在加載圖片時,系統(tǒng)自動會根據(jù)屏幕分辨率優(yōu)先選擇到符合自己分配率的文件夾(2.0x或者3.0x或者4.0x)下去取相對應(yīng)的圖片,如果當(dāng)前文件夾下沒有,則會到低一倍的文件夾下去,如果還沒有,則繼續(xù)向更低一倍去取。(比如:iOS 5.5英寸及以上屏幕會優(yōu)先選擇去3.0x下去取圖片,如果3.0x不存在或者3.0x文件夾下沒有,則去2.0x下??;如果2.0x不存在或者2.0x下沒有,則去1.0x下??;1.0x下再沒有,則在images文件下取)。
文章名稱:flutter下載圖片,flutter 圖片瀏覽器
網(wǎng)站URL:http://jinyejixie.com/article0/hopdoo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計、全網(wǎng)營銷推廣、Google
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)