应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Flutter实战请求封装(二)之dio

  用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢(原创不易,转发请标注来源和作者)
  注意:无特殊说明,flutter版本为3。0
  上篇总结了api的组织结构,这一篇我们探讨一下Flutter常用请求库Dio的使用和封装。一。dio
  一般http请求我们要关注的点有如下几个:
  访问路径,请求方式,请求头部,请求参数,超时时间,返回结果,返回类型等。
  注:(对httphttps协议不太明白的,需要补课的童鞋可以去看下基础教程https:www。runoob。comhttphttptutorial。html)
  首先看下dio可配置的参数:
  BaseOptions({
  String?method,
  int?connectTimeout,
  int?receiveTimeout,
  int?sendTimeout,
  StringbaseUrl,
  MapString,dynamic?queryParameters,
  MapString,dynamic?extra,
  MapString,dynamic?headers,
  ResponseType?responseTypeResponseType。json,
  String?contentType,
  ValidateStatus?validateStatus,
  bool?receiveDataWhenStatusError,
  bool?followRedirects,
  int?maxRedirects,
  RequestEncoder?requestEncoder,
  ResponseDecoder?responseDecoder,
  ListFormat?listFormat,
  this。setRequestContentTypeWhenNoPayloadfalse,
  })
  除了基础配置dio还提供了拦截器interceptors,适配器httpClientAdapter,请求方法get,post,delete,put,patch,download等基础的封装,方便我们使用。二。Http基础类
  classHttp{
  定义各类超时时间
  staticconstintCONNECTTIMEOUT10000;默认设置10s超时
  staticconstintRECEIVETIMEOUT3000;
  staticconstintSENDTIMEOUT3000;
  Dio?dio;
  staticHttpinstanceHttp。internal();
  1。internal()获取Dio实例的方法,主要是配置适配器Http。internal(){
  dioDio();
  dio。httpClientAdapterDefaultHttpClientAdapter()
  。。onHttpClientCreate(HttpClientc,lient){
  client。idleTimeoutDuration(milliseconds:CONNECTTIMEOUT);
  };
  添加错误统一处理拦截器
  dio!。interceptors。add(ErrorInterceptor());
  添加日志拦截器
  dio!。interceptors。add(DioLogInterceptor());
  2。post方法源码示例
  Futurepost(
  Stringpath,{
  requiredStringbaseUrl,
  MapString,dynamic?params,
  MapString,dynamic?headers,
  data,
  Options?options,
  CancelToken?cancelToken,
  })async{
  OptionsrequestOptionsoptions??Options();
  requestOptions。baseUrlbaseUrl;
  MapString,dynamic?authorizationheaders??getAuthorizationHeader();
  if(authorization!null){
  requestOptionsrequestOptions。copyWith(headers:authorization);
  }
  dio!。options。baseUrlbaseUrl;
  dio!。options。connectTimeoutCONNECTTIMEOUT;
  dio!。options。receiveTimeoutRECEIVETIMEOUT;
  dio!。options。sendTimeoutSENDTIMEOUT;
  varresponse;
  vartimeoutDuration(milliseconds:dio!。options。connectTimeout);
  cancelTokenCancelToken();
  vartTimer(timeout,(){
  if(responsenull){
  cancelToken!。cancel();
  }
  });
  response
  awaitdio!。post(path,data:data,queryParameters:params,options:requestOptions,cancelToken:cancelToken);
  t。cancel();
  returnresponse。data;
  }
  cancelToken是dio提供的一个非常有用的东西,可以主动在返回超时时候,主动结束请求,并触发DioErrorType。cancel的错误事件。
  三。httpUtils加强封装1。添加是否等待处理
  还以post为例,我们定义一个方法调用http的基础类
  staticFuturepost(Stringpath,{data,requiredStringbaseUrl,
  MapString,dynamic?params,
  Options?options,
  CancelToken?cancelToken,
  boolshowLoadingfalse}
  这里加了一个参数showLoading,在我们实际开发过程中,有一些操作要阻断用户操作,等待接口请求,一些是不需要用户感知的请求,我们可以在所有api中,默认添加该参数为false,有必要阻断用户的时候调用的时候将该参数设置成为true,举个例子如下:
  忘记密码
  staticFutureforgetPassword(dynamicparam,{boolshowLoadingfalse})async{
  varresawaitHttpUtils。post(forgetPassword,data:param,baseUrl:xxxshowLoading:showLoading);
  returnres;
  }
  当判断需要loading的时候
  if(showLoading){
  showLoadingDialog();
  }
  作者使用的是fluttersmartdialog:4。5。37,使用比较简单,你可以自己去封装所需要的loading样式。2。定义统一返回类型
  classApiResponseimplementsException{
  String?errorMsg;
  String?msg;
  int?code;
  T?data;
  ApiResponse(this。msg);
  ApiResponse。error(Stringmsg){
  toastMsg(msg);
  }
  override
  StringtoString(){
  returnMsg:msgerrorMsg:errorMsgData:data;
  }
  ApiResponse。fromJson(MapString,dynamicjson){
  msgjson〔msg〕;
  errorMsgjson〔errorMsg〕;
  codejson〔code〕;
  datajson〔data〕;
  }
  MapString,dynamictoJson(){
  finalMapString,dynamicdatanewMapString,dynamic();
  data〔msg〕this。msg;
  data〔errorMsg〕this。errorMsg;
  data〔code〕this。code;
  data〔data〕this。data;
  returndata;
  }
  }
  3。返回处理
  判断后台返回的正确code,则返回结果,完结后清除loading状态。
  源码如下
  classHttpUtils{staticFuturepost(Stringpath,
  {data,
  requiredStringbaseUrl,
  MapString,dynamic?params,
  Options?options,
  CancelToken?cancelToken,
  boolshowLoadingfalse,
  boolcanNullfalse,
  Function(Object?)?onError,
  boolerrorToasttrue,
  boolisolatetrue})async{
  if(showLoading){
  showLoadingDialog(path:path);
  }returnHttp()
  。post(
  path,
  baseUrl:baseUrl,
  data:data,
  params:params,
  options:options,
  cancelToken:cancelToken,
  )
  。then((value){
  varresultApiResponse。fromJson(valueisMap?value:jsonDecode(value));
  if(result。code2000){
  returnresult。data;
  }else{
  throwApiResponse(result。msg!);
  }
  })。onError((error,stackTrace){
  if(onError!null){
  onError(error);
  }
  if(errorisRemoteError){
  toastMsg(网络连接失败,displayType:SmartToastType。last);
  }elseif(errorisApiResponse){
  toastMsg(error。msg!);
  }else{
  toastMsg(未知错误);
  }
  throwException(error。toString());
  })。whenComplete((){
  if(showLoading){
  SmartDialog。dismiss();
  }
  });
  }

世界上最优秀的教练,成功是因为他的四大狡猾吗?他是运动员队伍中教练做的最好的,也是教练队伍中第一位集奥运会、世锦赛、世界杯单打冠军于一身的大满贯男子乒乓球运动员,他带领中国乒乓健儿,东挡西杀,南征北战,所向披靡,为国家赢得……莱森光学高光谱遥感高光谱遥感是高光谱分辨率遥感(HyperspectralRemoteSensing)的简称。它是在电磁波谱的可见光,近红外,中红外和热红外波段范围内,获取许多非常窄的光谱连续的……通过哈勃太空望远镜看宇宙每当人们凝视星空,思索太空的诸多奥秘,会产生一种特殊的惊奇感。数百年来,这些奥秘一直无法解开,因为科学家只能从地球上观察太空。为了捕捉图像,来自太空的光必须穿过地球湍流的……日本相扑科普文对于相扑()这项运动,一直觉得好奇,平常会从电视上看一些比赛,觉得很有趣所以就查了一些资料,希望和大家分享。相扑在日本国内的地位非常高,受到很多人的喜欢。其实相扑的起源是……白发长在哪,病就从哪出?长在前额两鬓后脑勺,分别暗示啥?随着年龄的增长,身体各机能逐渐下降,人体也随之出现或多或少的衰老迹象,比如出现皱纹、色斑,身材变胖等,这都是衰老不可避免的情况,长白头发也是一样,是非常正常的生理现象。不……8分不算少!杜锋爱徒遇广东队易受伤,硬钢胡明轩,幸亏裁判拦着10月30日晚,CBA一场焦点大战打得荡气回肠,最终浙江队124:101战胜广东队,在首战失利之后完成了复仇,双方常规赛阶段不会再相遇,如果能在季后赛会师,这场比赛有着心理上的……景仰园骨灰林墓地价格多少钱?北京景仰园陵园在北京的昌平区,北京景仰园公墓环境优美,风景秀丽,依山傍水,它是一个地理位置非常好的墓地。近些年来越来越多的人选择购买景仰园的墓地。景仰园的价格是根据环境、碑型和……裁判赶紧拿球!易建联为何怒吼00后小将,慢镜再看一遍确实该骂CBA常规赛继续进行,本轮比赛卫冕冠军广东男篮迎来了北京男篮的挑战,自新赛季开赛以来,广东队状态相当不错,他们仅输掉一场,而北京队则是相当糟糕,一波三连败后在积分榜上的排名滑落……周琦正式启程飞赴澳洲开启NBL生涯随行带中国折扇送新队友北京时间10月22日,中国篮球队员周琦今天正式启程,飞往澳洲,开启他的NBL之旅。在今年夏天,周琦因为和新疆队续约谈判未能达成协议,个人单方面宣布退出新赛季的CBA,选择……世界最大早白垩世暴龙喀左中国暴龙如何横空出世2009年9月13日中国地质科学院地质研究所和喀喇沁左翼蒙古族自治县人民政府正式发布,辽宁喀左发现世界最大早白垩世暴龙化石。这是我国古生物两代科学家在全国各地寻找了40多年的物……中国女排现有接应二传的天花板曾春蕾爱情满心欢喜,将白头到老很多人发展受限,都是由于自身缺陷所致,生活中,一旦遇到人生不顺,感觉自己生不逢时时,不妨多思考一下,从自己身上找原因,做一些总结和分析,也许,顿时就会豁然开朗。很多时候,很多人……打一针需要工作多少年?120万抗癌神药进入医保谈判双11之际,在举国人民剁手的同时,一场分毛必争的谈判也在进行中。今年七月,医保局公布的相关名单里,共有271个药品通过初步形式审查。其中就有120万元一针的天价抗癌药。1……
华为MateX3手机确定首发华为全新技术,售价成花粉最大关注目前,经过多轮曝光,已经可以确定,华为MateX3手机将先于华为P60系列手机发布,而且华为MateX3手机将搭载华为最新研发技术,当然也是全球首发,因此华为MateX3手机成……浓眉把森林狼两大内线按地上摩擦,湖人和勇士的西决稳了20222023赛季NBA常规赛正在如火如荼的进行中,4月1日比赛结束后,来看下今日赛况以及西部最新排名:雷霆117121不敌步行者,爵士114122不敌凯尔特人,火箭以……5G赋能文旅产业科技保障助力寻根祭祖大槐树5日,第三十三届洪洞大槐树寻根祭祖大典在山西洪洞举行。向上摄中新网临汾4月5日电(记者李庭耀)5日,第三十三届洪洞大槐树寻根祭祖大典在山西洪洞举行,各地大槐树移民后裔代表……S30倒计时!蹭皮无数!TA竟真出新皮了!火锅皮肤也要来了?这次杨玉环终于不用蹭皮肤啦!她真出新皮啦而且还是联动时尚芭莎的首季皮肤,这就是说要开启新系列了,杨玉环是第一款,而第二款不出意外就是阿离,因为预热图很明显啦,是把伞哎!杨……现实中有多少人拿到生育补贴?在现代社会中,随着人们生活水平的不断提高和医学技术的不断发展,生育补贴成为了一种常见的社会福利措施。但是,对于这个问题的具体情况,许多人却并不清楚。在本篇文章中,我们将对生育补……设计计算机软件期间,嵌入式实时软件有哪些优势?嵌入式实时软件的专业性能较强,一般可以快速解决问题,这样一来,软件工作的效率就迅速提高了。在设计计算机软件期间,嵌入式实时软件是大家比较关注和好奇的点。从我国目前的发展实……300美元平替ChatGPT!UC伯克利领头,130亿参数小编辑:桃子好困【新智元导读】继草泥马(Alpaca)后,斯坦福联手CMU、UC伯克利等机构的学者再次发布了130亿参数模型骆马(Vicuna),仅需300美元就能实现ChatG……米体小因扎吉赛季结束后肯定会下课,除非他带国米赢欧冠冠军直播吧4月2日讯据《米兰体育报》报道,国米肯定会在赛季结束后解雇小因扎吉,除非赢得欧冠冠军。报道称,小因扎吉在国米的生涯已经结束。随着本轮输给佛罗伦萨,国米本赛季目前已在……别再用文件传输助手了,跨设备传文件这样既方便又快生活中碰到需要跨设备传输文件并且尽可能要快的情况时,用NAS来应付有些杀鸡用牛刀,各个品牌生态内的互传工具听上去不错,但现实情况却是大多数人手中的设备并不互通。不过办法总……每日一味抗癌中药乌饭果,美味野果能入药,常应用于宫颈癌乌饭果【品种来源】杜鹃花科植物乌饭果的干燥成熟果实。夏秋采,晒干用或鲜用。【别名】南烛子、米饭果、纯阳子、土千年健果、冷饭果、沙汤果、蚂蚁果、小马扎豆。【性味……加起来120岁的爱情!情人节深夜王石小30岁娇妻田朴珺秀恩爱2月14日深夜,王石小30岁的娇妻田朴珺在多个平台晒情人节礼物秀恩爱,再玩当年经典的红烧肉梗。朴珺发微博晒出王石送的情人节礼物,竟是一束摆放着红烧肉的花。此外,情人节当天,王石……世界环球帆船赛第二赛段落幕霍尔希姆PR队连续登顶中国日报2月13日电开普敦当地时间2月12日下午3点10分,随着霍尔希姆PR队第一个到达终点,2023年世界环球帆船赛第二赛段经过了17天19小时9秒的航行,终于决出了冠军。霍……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网