這是我參與8月更文挑戰的第4天,活動詳情檢視:8月更文挑戰
廢話開篇:文章內容主要是在使用flutter外掛過程中的一些總結。
步驟一、新增第三方外掛依賴
新增外掛庫:
cached_network_image: ^3.0.0
複製程式碼
安裝指令:
這裡就遇到了一些問題,工程在引入網路快取圖片元件前已經新增了 dio 網路依賴和 path_provider 本地儲存依賴, 但是 cached_network_image 也依賴了上面的兩個外掛,如果dio 和 path_provider的版本跟 cached_network_image 的版本不匹配會報錯,不過沒關係,報錯時終端會提示應載入的依賴元件的版本號,這裡根據提示修改好,再執行安裝外掛指令即可。
這裡將 dio 版本升級到 4.0.0 後發現之前到攔截器物件報錯,檢視版本後發現不但是攔截器物件的 onRequest、onResponse、onError方法的宣告引數變了,返回值也發生了變化,這裡記錄一下。
Interceptor dInter = InterceptorsWrapper(
onRequest: (RequestOptions options,RequestInterceptorHandler handler){
options.queryParameters.addAll({'token':'H+0At+PcIWLY1kjg4ws9gqzwsese9322B81ARjj2eMk='});
//以前版本這裡只return options即可,現在需要返回 handler.next(options)
return handler.next(options);
},
onResponse: (Response response,ResponseInterceptorHandler handler){
//同理
return handler.next(response);
},
onError: (DioError error,ErrorInterceptorHandler handler){
//同理
return handler.next(error);
}
);
複製程式碼
步驟二、簡單封裝一下網路載入圖片元件
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
class GeneralFadeInImage extends StatelessWidget {
String image;
BoxFit fit;
String placeholder;
double width;
GeneralFadeInImage({required this.image,this.fit = BoxFit.fill,this.placeholder = 'assets/images/placeholderimg.png',this.width = 0});
//載入網路圖片及快取
Widget _cacheImage(){
return (this.width == 0) ? CachedNetworkImage(
imageUrl: this.image,
fit: this.fit,
placeholder: (context, url) => Image.asset(this.placeholder,fit: this.fit,),
errorWidget: (context, url, error) =>
Image.asset('images/image-failed.png'),
) : CachedNetworkImage(
imageUrl: this.image,
fit: this.fit,
width: this.width,
placeholder: (context, url) => Image.asset(this.placeholder,fit: this.fit,),
errorWidget: (context, url, error) =>
Image.asset('images/image-failed.png'),
);
}
//載入網路圖片
Widget _loadNetworkImage(){
return (this.width == 0) ? new FadeInImage.assetNetwork(
placeholder: this.placeholder,
image: this.image,
fit: this.fit,
imageErrorBuilder: (context, error, stackTrace) {
return Image.asset(this.placeholder,fit: this.fit,);
}) : new FadeInImage.assetNetwork(
placeholder: this.placeholder,
width: this.width,
image: this.image,
fit: this.fit,
imageErrorBuilder: (context, error, stackTrace) {
return Image.asset(this.placeholder,fit: this.fit,width: this.width,);
});
}
@override
Widget build(BuildContext context) {
return _cacheImage();
}
}
複製程式碼
步驟三、使用操作
初始化必填項僅為網路圖片地址
new GeneralFadeInImage(image: url)
複製程式碼
最後封裝一個快取管理類,實現獲取快取圖片大小及清除快取圖片功能,ImageCache還可獲取快取圖片的數量、設定快取的圖片最大數量(預設是1000)等api。
import 'package:flutter/cupertino.dart';
class WSLCacheImageManager {
//讀取圖片快取大小
static String getAllSizeOfCacheImages(){
ImageCache? imageCache = PaintingBinding.instance!.imageCache;
String cacheSizeStr = '0 kb';
if(imageCache != null) {
int byte = imageCache.currentSizeBytes;
if(byte >= 0 && byte < 1024) {
cacheSizeStr = '$byte B';
} if(byte >= 1024 && byte < 1024 * 1024) {
double size = (byte * 1.0 / 1024);
String sizeStr = size.toStringAsFixed(2);
cacheSizeStr = '$sizeStr KB';
}else {
double size = (byte * 1.0 / 1024) / 1024;
String sizeStr = size.toStringAsFixed(2);
cacheSizeStr = '$sizeStr MB';
}
}
return cacheSizeStr;
}
//清除所有圖片快取
static void clearAllCacheImage(){
ImageCache? imageCache = PaintingBinding.instance!.imageCache;
if(imageCache != null) {
imageCache.clear();
}
}
}
複製程式碼
好了,文章沒有太多技術含量,純屬個人使用總結,或許有的朋友也會有過類似的思考。寫下來,記錄一下,程式碼拙劣,大神勿噴,如果對大家有幫助,更是深感欣慰。