在 App 中會常常遇到須要從後臺拉取圖片的場景,這一方面會給服務器帶來網絡帶寬消耗,另外一方面加載圖片的等待過程也會影響用戶體驗。所以,每每會在 App 端對圖片作緩存機制,以免同一張圖片反覆發起請求。在 Flutter 中,cached_image_network 即提供了緩存網絡圖片功能,同時還提供了豐富的加載過程指示。緩存
上一篇Flutter 入門與實戰(六):給列表增長下拉刷新和上滑加載更多功能,咱們使用了列表,其中列表中有從網絡下載圖片。直接使用 Flutter 自帶的 Image.network 下載圖片一是沒法緩存,二是體驗不夠好。熟悉 iOS 的確定知道 SDWebImage,即 Objective-C 上用得最普遍的圖片緩存開源組件。與 SDWebImage 相似,Flutter 的 cached_image_network 插件也實現了這樣的功能。cached_image_network 使用十分簡單,首先在 pubspec.yaml 中添加依賴:服務器
dependencies:
flutter:
sdk: flutter
# ...其餘依賴
cached_network_image: ^3.0.0
複製代碼
以後在須要使用 cached_image_network 的地方引入源碼:markdown
import 'package:cached_network_image/cached_network_image.dart';
複製代碼
最後在須要加載網絡圖片的地方使用cached_image_network 替代原有的圖片加載方式(如 Image.network):網絡
CachedNetworkImage(imageUrl: "http://via.placeholder.com/350x150"),
複製代碼
以上是 cached_image_network 最簡單的用法,固然爲了用戶體驗更好,推薦是使用佔位圖或加載指示器的方式提示用戶圖片正在加載。app
CachedNetworkImage 提供了佔位圖和加載失敗後的錯誤指示的方法用於靜態指示。咱們分別準備 image-default.png 和 image-failed.png 文件表示默認佔位圖和加載失敗後的佔位圖,而後用 CachedNetworkImage 構造方法的 placeholder 和 errorWidget 來使用佔位圖,以下所示:post
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'),
),
);
}
}
複製代碼
也可使用進度加載指示器來指示加載進度,加載進度指示支持原型進度和線型進度。這種對於大圖預覽時會更爲經常使用,代碼以下所示,其中LinearProgressIndicator是線型指示器,CircularProgressIndicator 是圓形指示器:ui
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'),
),
);
}
複製代碼
效果以下圖所示,下拉刷新後,能夠先看到佔位圖,而後逐漸過渡到加載成功的圖片。若是修改連接爲一個非法連接或資源不存在的連接,則會顯示圖片加載失敗的佔位圖。這種體驗相比空白沒有任何指示的 Image.network好不少。 url