跟我学企业级flutter项目:如何重新定制cached_network_image的缓存管理与Dio网络请求

news/2024/11/14 14:48:20/

前言

flutter中需要展示网络图片时候,不建议使用flutter原本Image.network(),建议最好还是采用cached_network_image这个三方库。那么我今天就按照它来展开说明,我再做企业级项目时如何重新定制cached_network_image。

由于我的项目网络请求采用Dio库,所以我希望我的图片库也采用Dio来网络请求,也是为了方便请求日志打印(在做APM监控时候可以看到网络请求状态,方便定位问题)。

前期准备

准备好mime_converter类,由于cached_network_image中的manager这个文件不是export的状态,那么我们需要准备好该类,以便我们自己实现网络请求修改。

实现mime_converter

创建mime_converter 类,代码如下:

import 'dart:io';///将最常见的MIME类型转换为最期望的文件扩展名。
extension ContentTypeConverter on ContentType {String get fileExtension => mimeTypes[mimeType] ?? '.$subType';
}///MIME类型的来源:
/// https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types
///2020年3月20日时更新
const mimeTypes = {'application/vnd.android.package-archive': '.apk','application/epub+zip': '.epub','application/gzip': '.gz','application/java-archive': '.jar','application/json': '.json','application/ld+json': '.jsonld','application/msword': '.doc','application/octet-stream': '.bin','application/ogg': '.ogx','application/pdf': '.pdf','application/php': '.php','application/rtf': '.rtf','application/vnd.amazon.ebook': '.azw','application/vnd.apple.installer+xml': '.mpkg','application/vnd.mozilla.xul+xml': '.xul','application/vnd.ms-excel': '.xls','application/vnd.ms-fontobject': '.eot','application/vnd.ms-powerpoint': '.ppt','application/vnd.oasis.opendocument.presentation': '.odp','application/vnd.oasis.opendocument.spreadsheet': '.ods','application/vnd.oasis.opendocument.text': '.odt','application/vnd.openxmlformats-officedocument.presentationml.presentation':'.pptx','application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': '.xlsx','application/vnd.openxmlformats-officedocument.wordprocessingml.document':'.docx','application/vnd.rar': '.rar','application/vnd.visio': '.vsd','application/x-7z-compressed': '.7z','application/x-abiword': '.abw','application/x-bzip': '.bz','application/x-bzip2': '.bz2','application/x-csh': '.csh','application/x-freearc': '.arc','application/x-sh': '.sh','application/x-shockwave-flash': '.swf','application/x-tar': '.tar','application/xhtml+xml': '.xhtml','application/xml': '.xml','application/zip': '.zip','audio/3gpp': '.3gp','audio/3gpp2': '.3g2','audio/aac': '.aac','audio/x-aac': '.aac','audio/midi audio/x-midi': '.midi','audio/mpeg': '.mp3','audio/ogg': '.oga','audio/opus': '.opus','audio/wav': '.wav','audio/webm': '.weba','font/otf': '.otf','font/ttf': '.ttf','font/woff': '.woff','font/woff2': '.woff2','image/bmp': '.bmp','image/gif': '.gif','image/jpeg': '.jpg','image/png': '.png','image/svg+xml': '.svg','image/tiff': '.tiff','image/vnd.microsoft.icon': '.ico','image/webp': '.webp','text/calendar': '.ics','text/css': '.css','text/csv': '.csv','text/html': '.html','text/javascript': '.js','text/plain': '.txt','text/xml': '.xml','video/3gpp': '.3gp','video/3gpp2': '.3g2','video/mp2t': '.ts','video/mpeg': '.mpeg','video/ogg': '.ogv','video/webm': '.webm','video/x-msvideo': '.avi','video/quicktime': '.mov'
};

实现FileServiceResponse

FileServiceResponse是数据处理的关键,那么我们来实现该类


class DioGetResponse implements FileServiceResponse {DioGetResponse(this._response);final DateTime _receivedTime = clock.now();final Response<ResponseBody> _response;@overrideint get statusCode => _response.statusCode!;@overrideStream<List<int>> get content => _response.data!.stream;@overrideint? get contentLength => _getContentLength();int _getContentLength() {try {return int.parse(_header(HttpHeaders.contentLengthHeader) ?? '-1');} catch (e) {return -1;}}String? _header(String name) {return _response.headers[name]?.first;}@overrideDateTime get validTill {// Without a cache-control header we keep the file for a weekvar ageDuration = const Duration(days: 7);final controlHeader = _header(HttpHeaders.cacheControlHeader);if (controlHeader != null) {final controlSettings = controlHeader.split(',');for (final setting in controlSettings) {final sanitizedSetting = setting.trim().toLowerCase();if (sanitizedSetting == 'no-cache') {ageDuration = const Duration();}if (sanitizedSetting.startsWith('max-age=')) {var validSeconds = int.tryParse(sanitizedSetting.split('=')[1]) ?? 0;if (validSeconds > 0) {ageDuration = Duration(seconds: validSeconds);}}}}return _receivedTime.add(ageDuration);}@overrideString? get eTag => _header(HttpHeaders.etagHeader);@overrideString get fileExtension {var fileExtension = '';final contentTypeHeader = _header(HttpHeaders.contentTypeHeader);if (contentTypeHeader != null) {final contentType = ContentType.parse(contentTypeHeader);fileExtension = contentType.fileExtension;}return fileExtension;}
}

实现FileService

实现FileService 参数为dio

class DioHttpFileService extends FileService {final Dio _dio;DioHttpFileService(this._dio);@overrideFuture<FileServiceResponse> get(String url, {Map<String, String>? headers}) async {Options options = Options(headers: headers ?? {}, responseType: ResponseType.stream);Response<ResponseBody> httpResponse = await _dio.get<ResponseBody>(url, options: options);return DioGetResponse(httpResponse);}
}

制定框架缓存管理器

我在项目中,设定了缓存配置最多缓存 100 个文件,并且每个文件只应缓存 7天,如果需要使用日志拦截器的话,就在拦截器中增加日志拦截:

class LibCacheManager {static const key = 'libCacheKey';///缓存配置 {最多缓存 100 个文件,并且每个文件只应缓存 7}static CacheManager instance = CacheManager(Config(key,stalePeriod: const Duration(days: 7),maxNrOfCacheObjects: 100,fileService : DioHttpFileService(Dio()))),);}

项目中使用

使用如下

CachedNetworkImage(imageUrl: "https://t8.baidu.com/it/u=3845489932,4046458829&fm=74&app=80&size=f256,256&n=0&f=JPEG&fmt=auto?sec=1654102800&t=f6de842e1e7086ffc73536795d37fd2c",cacheManager: LibCacheManager.instance,width: 100,height: 100,placeholder: (context, url) => ImgPlaceHolder(),errorWidget: (context, url, error) => ImgError(),
);

如上便是 如何重新定制cached_network_image的缓存管理与Dio网络请求


http://www.ppmy.cn/news/529872.html

相关文章

java后端高级面试题,线程面试题2022

前言 我们从一个问题引入今天的主题。 在日常业务开发中&#xff0c;我们可能经常听到 DBA 对我们说“不要”&#xff08;注意&#xff1a;不是禁止&#xff09;使用 join&#xff0c;那么为什么 DBA 对 join 这么抵触呢&#xff1f;是 join 本身有问题&#xff0c;还是我们使…

ABBYY最新版本OCR文字图像识别软件v16

FineReader PDF使专业人士在数字化工作场所能够最大限度地提高效率。 FineReader PDF最大特色是采用了ABBYY最新推出的基于AI的OCR技术&#xff0c;可以更轻松地在同一工作流程中对各种文档进行数字化、检索、编辑、加密、共享和协作。 现在&#xff0c;信息工作者能将更多时间…

【HTB】Poison(LFI+文件解析漏洞,ssh转发,vnc)

请访问原文链接&#xff1a;sysin.org/blog/junipe…&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者&#xff1a;gc(at)sysin.org&#xff0c;主页&#xff1a;www.sysin.org 防火墙 HA 配置系列文章&#xff1a; Cisco Firepower FTD HA 配置文档Fort…

Juniper SSG 550M NSRP配置文档

主防火墙 unset interface e4 ip 将e4的ip地址删除 set interface e4 zone ha 将e4和HA区域绑定一起 SSG550-> set nsrp cluster id 1 设置cluster组号 SSG550(M)-> set nsrp vsd id 0 设置VSD的组号,这条命令可以不用输入&#xff0c;因为Netscreen防火墙的默认的虚拟安…

Multi-scale_Guided_Image_and_Video_Fusion 多尺度引导图像与视频融合

Multi-scale_Guided_Image_and_Video_Fusion 多尺度引导图像与视频融合 MGFF引入原始方法GFGFF的两个主要问题。 MGFF引出综述GF 和 多尺度引导图像分解GF综述多尺度引导的图像分解和重建过程 提出的方法多尺度引导图像分解多尺度引导图像融合VSD 视觉显著性检测权重图计算细节…

病毒分析--WannaCry分析--1

工具列表 Detect It Eas2.04:是一个多功能的PE-DIY工具,主要用于壳侦测. IDA pro Hash值校验工具 Resource Hacker PEid 010Edit Windows7 WannaCry WannaCry&#xff08;又叫Wanna Decryptor&#xff09;&#xff0c;一种“蠕虫式”勒索病毒软件&#xff0c;大小3.3MB…

java 虚拟内存占用很多,Java 进程占用 VIRT 虚拟内存超高的问题

1.现象 最近发现线上机器java 8进程的VIRT虚拟内存使用达到了11G+: 2.不管用的-Xmx 首先第一想到的当然使用java的-Xmx去限制堆的使用。但是无论怎样设置,都没有什么效果。没办法,只好开始苦逼的研究。 3.什么是VIRT 现代操作系统里面分配虚拟地址空间操作不同于分配物理内…

Linux基础命令及部分使用

Linux基础命令及使用 Linux基础命令概括 1.Linux常用系统命令 echo #用于在终端输出字符串或变量 date #用于显示及设置系统的时间或日期 reboot #用于重启系统 poweroff #用于关闭系统 shutdown #用于关闭系统 wget #用于终端中下载文件 ps #用于查看系统中进程状态 top #用于…