dio网络请求dio:5。1。1https:github。comllfbanditdiocacheinterceptordio缓存拦截器(如果使用的话:cacheStoreMemCacheStore(maxSize:10485760,maxEntrySize:1048576);)diocacheinterceptor:3。4。1dio文件缓存拦截器(本项目使用此插件)diocacheinterceptorfilestore:1。2。2dio重试拦截器diosmartretry:5。0。0dioahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a拦截器prettydiologger:1。3。1缓存需要的路径pathprovider:2。0。14importpackage:diodio。dart;importpackage:diocacheinterceptordiocacheinterceptor。dart;importpackage:diocacheinterceptorfilestorediocacheinterceptorfilestore。dart;importpackage:diosmartretrydiosmartretry。dart;importpackage:prettydiologgerprettydiologger。dart;importpackage:pathproviderpathprovider。dart;importpackage:pathpath。dartshowjoin; 关于dio拦截器:https:github。comllfbanditdiocacheinterceptor网路请求Dio工具类classDioUtils{latefinalDiodio;CacheOptions?cacheOptions;单例staticDioUtils?instance;factoryDioUtils()instance??DioUtils。internal();staticDioUtilsgetsharedinstance??DioUtils。internal();私有命名构造函数DioUtils。internal(){dio配置BaseOptionsbaseOptionsBaseOptions(connectTimeout:constDuration(seconds:10),receiveTimeout:constDuration(seconds:10),sendTimeout:constDuration(seconds:10),baseUrl:https:gateway。ngrok。i84。com。cn,);初始化dio实例dioDio(baseOptions);}初始化Dio拦截器配置FuturevoiddioInterceptorConfig()async{一定要注意拦截器的顺序,第一个为缓存,如果缓存执行就不需要走下面的逻辑了,网络拦截器注意放在最后。cacheOptionsawaitgeFileCacheOptions();设置拦截器dio缓存拦截器。。interceptors。add(DioCacheInterceptor(options:cacheOptions!))重试拦截器。。interceptors。add(RetryInterceptor(dio:dio))网络拦截器,发生网络请求响应后使用。。interceptors。add(InterceptorsWrapper(onRequest:(request,handler){可以添加header信息request。headers〔token〕;handler。next(request);},onResponse:(response,handler){if(response。datanull){response。data〔data〕jsonDecode({});}handler。next(response);},onError:(e,handler){print(错误error:{e。error}{e。message}{e。response?。statusCode}{e。type});},),)ahrefhttps:www。bs178。comrizhitargetblankclassinfotextkey日志a拦截器。。interceptors。add(PrettyDioLogger(request:true,requestBody:true,responseBody:true,compact:true,error:true,));}}Dio缓存拦截器配置optionsextensionDioUtilsCacheExtensiononDioUtils{FutureCacheOptionsgeFileCacheOptions()async{缓存的文件夹名称StringcacheDirNamesystemenvinfo;创建缓存路径DirectorydirawaitgetTemporaryDirectory();Stringpathjoin(dir。path,cacheDirName);Stringpathdir。path;print(缓存地址:path);varoptionsCacheOptions(store:FileCacheStore(path),store:MemCacheStore(maxSize:10485760,maxEntrySize:1048576),policy:CachePolicy。request,hitCacheOnErrorExcept:〔401,403〕,maxStale:constDuration(days:7),priority:CachePriority。normal,allowPostMethod:true,keyBuilder:CacheOptions。defaultCacheKeyBuilder,);returnoptions;}}请求结果做一个包装,用于识别请求结果是来自于缓存还是网络enumHttpResultType{success,failure,catchError,}可根据自己的需求,定义最终返回的模型classHttpsResultT{finalT?data;finalString?message;finalintcode;finalintstatusCode;finalString?statusMessage;finalboolisCache;finalHttpResultTyperesultType;finaldynamiccatchError;HttpsResult({requiredthis。resultType,this。data,this。code0,this。message,this。statusCode0,this。statusMessage,this。isCachefalse,this。catchError,});}以下封装外部调用的POST请求请求扩展extensionDioRequestExtensiononDioUtils{describePOST请求url请求地址fromJson模型转换的命名构造函数params请求参数useCache是否需要缓存FutureHttpsResultTpostT(Stringurl,{requiredTFunction(MapString,dynamic)fromJson,MapString,dynamicparamsconst{},booluseCachefalse,})async{封装结果HttpsResultTonCacheResult(Responseresponse,boolisCache){MapString,dynamicresultDataresponse。data〔data〕;intcoderesponse。data〔code〕??0;String?messageresponse。data〔msg〕;if(response。statusCode200){returnHttpsResult(resultType:HttpResultType。success,data:fromJson(resultData),code:code,message:message,statusCode:response。statusCode??0,statusMessage:response。statusMessage,isCache:isCache,);}else{returnHttpsResult(resultType:HttpResultType。failure,data:fromJson(resultData),code:code,message:message,statusCode:response。statusCode??0,statusMessage:response。statusMessage,isCache:isCache,);}}请求try{每次请求发生两次回调,先回调缓存的结果,再回调实际请求的结果,适用于先展示缓存数据,得到网络请求结果后再刷新页面的场景。没有缓存时只回调网络请求的结果,网络请求失败时只回调缓存的结果。OptionsoptionscacheOptions!。copyWith(policy:useCache?CachePolicy。refreshForceCache:CachePolicy。noCache,)。toOptions();finalresponseawaitdio。post(url,data:params,options:options,);有缓存HttpsResultTresult;if(response。extra〔fromNetwork〕false){先试用缓存resultonCacheResult(response,true);再请求一次finalnewResponseawaitdio。post(url,data:params,options:cacheOptions!。copyWith(policy:CachePolicy。noCache)。toOptions(),);if(newResponse。statusCode!200){returnresult;}returnonCacheResult(newResponse,false);}else{没有缓存returnonCacheResult(response,false);}}catch(error){returnHttpsResult(resultType:HttpResultType。catchError,catchError:error,);}}}使用案例:overridevoidinitState(){初始化Dio配置DioUtils。shared。dioInterceptorConfig();super。initState();}Dio请求ElevatedButton(onPressed:()async{varmodelawaitDioUtils。shared。postServerModel(url,params:{},fromJson:ServerModel。fromMap,useCache:true,);print(结果:{model。data?。content}{model。resultType});},child:Text(Dio请求post),)