Flutter 使用cached_image_network優(yōu)化圖片加載體驗(yàn)
在 App 中會(huì)經(jīng)常遇到需要從后臺(tái)拉取圖片的場(chǎng)景,這一方面會(huì)給服務(wù)器帶來(lái)網(wǎng)絡(luò)帶寬消耗,另一方面加載圖片的等待過(guò)程也會(huì)影響用戶體驗(yàn)。因此,往往會(huì)在 App 端對(duì)圖片做緩存機(jī)制,以避免同一張圖片反復(fù)發(fā)起請(qǐng)求。這個(gè)時(shí)候cached_image_network就派上用場(chǎng)了
上一篇Flutter 給列表增加下拉刷新和上滑加載更多功能,我們使用了列表,其中列表中有從網(wǎng)絡(luò)下載圖片。直接使用 Flutter 自帶的 Image.network 下載圖片一是無(wú)法緩存,二是體驗(yàn)不夠好。熟悉 iOS 的肯定知道 SDWebImage,即 Objective-C 上用得最廣泛的圖片緩存開(kāi)源組件。與 SDWebImage 類(lèi)似,F(xiàn)lutter 的 cached_image_network 插件也實(shí)現(xiàn)了這樣的功能。cached_image_network 使用十分簡(jiǎn)單,首先在 pubspec.yaml 中添加依賴:
dependencies:
flutter:
sdk: flutter
# ...其他依賴
cached_network_image: ^3.0.0
之后在需要使用 cached_image_network 的地方引入源碼:
import 'package:cached_network_image/cached_network_image.dart';
最后在需要加載網(wǎng)絡(luò)圖片的地方使用cached_image_network 替代原有的圖片加載方式(如 Image.network):
CachedNetworkImage(imageUrl: "http://via.placeholder.com/350x150"),
以上是 cached_image_network 最簡(jiǎn)單的用法,當(dāng)然為了用戶體驗(yàn)更好,推薦是使用占位圖或加載指示器的方式提示用戶圖片正在加載。
使用占位圖
CachedNetworkImage 提供了占位圖和加載失敗后的錯(cuò)誤指示的方法用于靜態(tài)指示。我們分別準(zhǔn)備 image-default.png 和 image-failed.png 文件表示默認(rèn)占位圖和加載失敗后的占位圖,然后用 CachedNetworkImage 構(gòu)造方法的 placeholder 和 errorWidget 來(lái)使用占位圖,如下所示:
Widget _imageWrapper(String imageUrl) {
return SizedBox(
width: 150,
height: ITEM_HEIGHT,
child: CachedNetworkImage(
imageUrl: imageUrl,
placeholder: (context, url) => Image.asset('images/image-default.png'),
errorWidget: (context, url, error) =>
Image.asset('images/image-failed.png'),
),
);
}
}
使用進(jìn)度加載指示
也可以使用進(jìn)度加載指示器來(lái)指示加載進(jìn)度,加載進(jìn)度指示支持原型進(jìn)度和線型進(jìn)度。這種對(duì)于大圖預(yù)覽時(shí)會(huì)更為常用,代碼如下所示,其中LinearProgressIndicator是線型指示器,CircularProgressIndicator 是圓形指示器:
Widget _imageWrapper(String imageUrl) {
return SizedBox(
width: 150,
height: ITEM_HEIGHT,
child: CachedNetworkImage(
imageUrl: imageUrl,
progressIndicatorBuilder: (context, url, downloadProgress) =>
LinearProgressIndicator(value: downloadProgress.progress),
errorWidget: (context, url, error) =>
Image.asset('images/image-failed.png'),
),
);
}
效果
效果如下圖所示,下拉刷新后,可以先看到占位圖,然后逐漸過(guò)渡到加載成功的圖片。如果修改鏈接為一個(gè)非法鏈接或資源不存在的鏈接,則會(huì)顯示圖片加載失敗的占位圖。這種體驗(yàn)相比空白沒(méi)有任何指示的 Image.network好很多。

以上就是Flutter 使用cached_image_network優(yōu)化圖片加載體驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于Flutter 用cached_image_network優(yōu)化圖片加載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Android WebView 不支持 H5 input type="file" 解決方法
這篇文章主要介紹了Android WebView 不支持 H5 input type="file" 解決方法,需要的朋友可以參考下2017-06-06
Android TextView 設(shè)置字體大小的方法
這篇文章主要介紹了Android TextView 設(shè)置字體大小的方法的相關(guān)資料,需要的朋友可以參考下2016-02-02
Android TextView前增加紅色必填項(xiàng)星號(hào)*的示例代碼
TextView是一個(gè)完整的文本編輯器,但是基類(lèi)為不允許編輯,其子類(lèi)EditText允許文本編輯,這篇文章主要介紹了Android TextView前增加紅色必填項(xiàng)星號(hào)*的示例代碼,需要的朋友可以參考下2024-03-03
Android簡(jiǎn)易圖片瀏覽器的實(shí)現(xiàn)
最近做了一個(gè)圖片瀏覽小程序,本文主要介紹了Android簡(jiǎn)易圖片瀏覽器的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03
Android Studio實(shí)現(xiàn)自定義全局懸浮按鈕的示例代碼
在 Android 應(yīng)用中實(shí)現(xiàn)全局懸浮按鈕是一個(gè)常見(jiàn)的需求,可以用于快速訪問(wèn)重要功能或返回頂部等操作,下面我將詳細(xì)介紹如何實(shí)現(xiàn)一個(gè)自定義的全局懸浮按鈕,感興趣的小伙伴跟著小編一起來(lái)看看吧2025-04-04
Android實(shí)現(xiàn)的秒表計(jì)時(shí)器示例
這篇文章主要介紹了Android實(shí)現(xiàn)的秒表計(jì)時(shí)器,結(jié)合完整實(shí)例形式分析了Android計(jì)時(shí)器的具體實(shí)現(xiàn)步驟與相關(guān)技巧,涉及Android針對(duì)日期與時(shí)間的操作方法,需要的朋友可以參考下2016-08-08
Android HTTP發(fā)送請(qǐng)求和接收響應(yīng)的實(shí)例代碼
Android HTTP請(qǐng)求和接收響應(yīng)實(shí)例完整的Manifest文件如下,感興趣的朋友可以參考下哈,希望對(duì)大家有所幫助2013-06-06
Android實(shí)現(xiàn)上拉加載更多以及下拉刷新功能(ListView)
這篇文章主要介紹了Android實(shí)現(xiàn)上拉加載更多功能以及下拉刷新功能的相關(guān)資料,需要的朋友可以參考下2016-01-01
Android編程獲取GPS數(shù)據(jù)的方法詳解
這篇文章主要介紹了Android編程獲取GPS數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android地理位置操作的相關(guān)函數(shù)與使用技巧,需要的朋友可以參考下2016-10-10
Android View移動(dòng)的六種方法小結(jié)
在android開(kāi)發(fā)中,經(jīng)常會(huì)遇到一個(gè)view需要它能夠支持滑動(dòng)的需求。下面通過(guò)本篇文章給大家介紹android view移動(dòng)的六種方法,對(duì)android view移動(dòng)相關(guān)知識(shí)感興趣的朋友一起學(xué)習(xí)吧2015-12-12

