




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】如何在Flutter中实现Dio的二次封装
如何在Flutter中实现Dio的二次封装?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。目录:DioManager:Dio辅助类NWMethod:请求方法,get、post等NWApi:大家都知道EntityFactory:json转换辅助工厂,把json转为TBaseEntity<T>:数据基类,返回的参数为{“code”:0,“message”:“”,“data”:{}}BaseListEntity<T>:数据基类2,返回的参数为{“code”:0,“message”:“”,“data”:[]}ErrorEntity:请求报错基类,{“code”:0,“message”:“”}EntityFactory:class
EntityFactory
{
static
T
generateOBJ<T>(json)
{
if
(json
==
null)
{
return
null;
}
//可以在这里加入任何需要并且可以转换的类型,例如下面
//
else
if
(T.toString()
==
"LoginEntity")
{
//
return
LoginEntity.fromJson(json)
as
T;
//
}
else
{
return
json
as
T;
}
}
}BaseEntity:class
BaseEntity<T>
{
int
code;
String
message;
T
data;
BaseEntity({this.code,
this.message,
this.data});
factory
BaseEntity.fromJson(json)
{
return
BaseEntity(
code:
json["code"],
message:
json["msg"],
//
data值需要经过工厂转换为我们传进来的类型
data:
EntityFactory.generateOBJ<T>(json["data"]),
);
}
}BaseListEntity:class
BaseListEntity<T>
{
int
code;
String
message;
List<T>
data;
BaseListEntity({this.code,
this.message,
this.data});
factory
BaseListEntity.fromJson(json)
{
List<T>
mData
=
List();
if
(json['data']
!=
null)
{
//遍历data并转换为我们传进来的类型
(json['data']
as
List).forEach((v)
{
mData.add(EntityFactory.generateOBJ<T>(v));
});
}
return
BaseListEntity(
code:
json["code"],
message:
json["msg"],
data:
mData,
);
}
}ErrorEntity:class
ErrorEntity
{
int
code;
String
message;
ErrorEntity({this.code,
this.message});
}NWApi:class
NWApi
{
static
final
baseApi
=
"https://easy-mock.bookset.io/mock/5dfae67d4946c20a50841fa7/example/";
static
final
loginPath
=
"user/login";//接口返回:{"code":
int,
"message":
"String",
"data":
{"account":
"String",
"password":
"String"}}
static
final
queryListPath
=
"/query/list";//接口返回:{"code":
ing,
"message":
"String",
"data":
[int,
int,
String,
int,
String,
int]}
static
final
queryListJsonPath
=
"/query/listjson";//接口返回:{"code":
int,
"message":
"String",
"data":
[{"account":
"String",
"password":
"String"},
{"account":
"String",
"password":
"String"}]}
}NWMethod:enum
NWMethod
{
GET,
POST,
DELETE,
PUT
}
//使用:NWMethodValues[NWMethod.POST]
const
NWMethodValues
=
{
NWMethod.GET:
"get",
NWMethod.POST:
"post",
NWMethod.DELETE:
"delete",
NWMethod.PUT:
"put"
};下面就可以进行正式的封装了:第一步是创建Dio的单例辅助类,并初始化Dio和对Dio进行一些全局的参数设置:import
'package:dio/dio.dart';
import
'package:flutter_app/network/NWApi.dart';
import
'package:flutter_app/utils/PrintUtil.dart';
class
DioManager
{
static
final
DioManager
_shared
=
DioManager._internal();
factory
DioManager()
=>
_shared;
Dio
dio;
DioManager._internal()
{
if
(dio
==
null)
{
BaseOptions
options
=
BaseOptions(
baseUrl:
NWApi.baseApi,
contentType:
Headers.jsonContentType,
responseType:
ResponseType.json,
receiveDataWhenStatusError:
false,
connectTimeout:
30000,
receiveTimeout:
3000,
);
dio
=
Dio(options);
}
}
}第二步对请求进行封装,在我的想法中{“code”:0,“message”:“”,“data”:{}}和{“code”:0,“message”:“”,“data”:[]}这两种数据是要分开两个请求方法的:
//
请求,返回参数为
T
//
method:请求方法,NWMethod.POST等
//
path:请求地址
//
params:请求参数
//
success:请求成功回调
//
error:请求失败回调
Future
request<T>(NWMethod
method,
String
path,
{Map
params,
Function(T)
success,
Function(ErrorEntity)
error})
async
{
try
{
Response
response
=
await
dio.request(path,
queryParameters:
params,
options:
Options(method:
NWMethodValues[method]));
if
(response
!=
null)
{
BaseEntity
entity
=
BaseEntity<T>.fromJson(response.data);
if
(entity.code
==
0)
{
success(entity.data);
}
else
{
error(ErrorEntity(code:
entity.code,
message:
entity.message));
}
}
else
{
error(ErrorEntity(code:
-1,
message:
"未知错误"));
}
}
on
DioError
catch(e)
{
error(createErrorEntity(e));
}
}
//
请求,返回参数为
List
//
method:请求方法,NWMethod.POST等
//
path:请求地址
//
params:请求参数
//
success:请求成功回调
//
error:请求失败回调
Future
requestList<T>(NWMethod
method,
String
path,
{Map
params,
Function(List)
success,
Function(ErrorEntity)
error})
async
{
try
{
Response
response
=
await
dio.request(path,
queryParameters:
params,
options:
Options(method:
NWMethodValues[method]));
if
(response
!=
null)
{
BaseListEntity
entity
=
BaseListEntity<T>.fromJson(response.data);
if
(entity.code
==
0)
{
success(entity.data);
}
else
{
error(ErrorEntity(code:
entity.code,
message:
entity.message));
}
}
else
{
error(ErrorEntity(code:
-1,
message:
"未知错误"));
}
}
on
DioError
catch(e)
{
error(createErrorEntity(e));
}
}提取请求错误处理方法createErrorEntity:
//
错误信息
ErrorEntity
createErrorEntity(DioError
error)
{
switch
(error.type)
{
case
DioErrorType.CANCEL:{
return
ErrorEntity(code:
-1,
message:
"请求取消");
}
break;
case
DioErrorType.CONNECT_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"连接超时");
}
break;
case
DioErrorType.SEND_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"请求超时");
}
break;
case
DioErrorType.RECEIVE_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"响应超时");
}
break;
case
DioErrorType.RESPONSE:{
try
{
int
errCode
=
error.response.statusCode;
String
errMsg
=
error.response.statusMessage;
return
ErrorEntity(code:
errCode,
message:
errMsg);
//
switch
(errCode)
{
//
case
400:
{
//
return
ErrorEntity(code:
errCode,
message:
"请求语法错误");
//
}
//
break;
//
case
403:
{
//
return
ErrorEntity(code:
errCode,
message:
"服务器拒绝执行");
//
}
//
break;
//
case
404:
{
//
return
ErrorEntity(code:
errCode,
message:
"无法连接服务器");
//
}
//
break;
//
case
405:
{
//
return
ErrorEntity(code:
errCode,
message:
"请求方法被禁止");
//
}
//
break;
//
case
500:
{
//
return
ErrorEntity(code:
errCode,
message:
"服务器内部错误");
//
}
//
break;
//
case
502:
{
//
return
ErrorEntity(code:
errCode,
message:
"无效的请求");
//
}
//
break;
//
case
503:
{
//
return
ErrorEntity(code:
errCode,
message:
"服务器挂了");
//
}
//
break;
//
case
505:
{
//
return
ErrorEntity(code:
errCode,
message:
"不支持HTTP协议请求");
//
}
//
break;
//
default:
{
//
return
ErrorEntity(code:
errCode,
message:
"未知错误");
//
}
//
}
}
on
Exception
catch(_)
{
return
ErrorEntity(code:
-1,
message:
"未知错误");
}
}
break;
default:
{
return
ErrorEntity(code:
-1,
message:
error.message);
}
}
}完整的DioManager类代码:import
'package:dio/dio.dart';
import
'package:flutter_app/network/entity/BaseEntity.dart';
import
'package:flutter_app/network/entity/BaseListEntity.dart';
import
'package:flutter_app/network/entity/EntityFactory.dart';
import
'package:flutter_app/network/entity/ErrorEntity.dart';
import
'package:flutter_app/network/NWApi.dart';
import
'package:flutter_app/network/NWMethod.dart';
class
DioManager
{
static
final
DioManager
_shared
=
DioManager._internal();
factory
DioManager()
=>
_shared;
Dio
dio;
DioManager._internal()
{
if
(dio
==
null)
{
BaseOptions
options
=
BaseOptions(
baseUrl:
NWApi.baseApi,
contentType:
Headers.jsonContentType,
responseType:
ResponseType.json,
receiveDataWhenStatusError:
false,
connectTimeout:
30000,
receiveTimeout:
3000,
);
dio
=
Dio(options);
}
}
//
请求,返回参数为
T
//
method:请求方法,NWMethod.POST等
//
path:请求地址
//
params:请求参数
//
success:请求成功回调
//
error:请求失败回调
Future
request<T>(NWMethod
method,
String
path,
{Map
params,
Function(T)
success,
Function(ErrorEntity)
error})
async
{
try
{
Response
response
=
await
dio.request(path,
queryParameters:
params,
options:
Options(method:
NWMethodValues[method]));
if
(response
!=
null)
{
BaseEntity
entity
=
BaseEntity<T>.fromJson(response.data);
if
(entity.code
==
0)
{
success(entity.data);
}
else
{
error(ErrorEntity(code:
entity.code,
message:
entity.message));
}
}
else
{
error(ErrorEntity(code:
-1,
message:
"未知错误"));
}
}
on
DioError
catch(e)
{
error(createErrorEntity(e));
}
}
//
请求,返回参数为
List
//
method:请求方法,NWMethod.POST等
//
path:请求地址
//
params:请求参数
//
success:请求成功回调
//
error:请求失败回调
Future
requestList<T>(NWMethod
method,
String
path,
{Map
params,
Function(List<T>)
success,
Function(ErrorEntity)
error})
async
{
try
{
Response
response
=
await
dio.request(path,
queryParameters:
params,
options:
Options(method:
NWMethodValues[method]));
if
(response
!=
null)
{
BaseListEntity
entity
=
BaseListEntity<T>.fromJson(response.data);
if
(entity.code
==
0)
{
success(entity.data);
}
else
{
error(ErrorEntity(code:
entity.code,
message:
entity.message));
}
}
else
{
error(ErrorEntity(code:
-1,
message:
"未知错误"));
}
}
on
DioError
catch(e)
{
error(createErrorEntity(e));
}
}
//
错误信息
ErrorEntity
createErrorEntity(DioError
error)
{
switch
(error.type)
{
case
DioErrorType.CANCEL:{
return
ErrorEntity(code:
-1,
message:
"请求取消");
}
break;
case
DioErrorType.CONNECT_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"连接超时");
}
break;
case
DioErrorType.SEND_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"请求超时");
}
break;
case
DioErrorType.RECEIVE_TIMEOUT:{
return
ErrorEntity(code:
-1,
message:
"响应超时");
}
break;
case
DioErrorType.RESPONSE:{
try
{
int
errCode
=
error.response.statusCode;
String
errMsg
=
error.response.statusMessage;
return
ErrorEntity(code:
"$errCode",
message:
errMsg);
//
switch
(errCode)
{
//
case
400:
{
//
return
ErrorEntity(code:
errCode,
message:
"请求语法错误");
//
}
//
break;
//
case
403:
{
//
return
ErrorEntity(code:
errCode,
message:
"服务器拒绝执行");
//
}
//
break;
//
case
404:
{
//
return
ErrorEntity(code:
errCode,
message:
"无法连接服务器");
//
}
//
break;
//
case
405:
{
//
return
ErrorEntity(code:
errCode,
message:
"请求方法被禁止");
//
}
//
break;
//
case
500:
{
//
return
ErrorEntity(code:
errCode,
message:
"服务器内部错误");
//
}
//
break;
//
case
502:
{
//
return
ErrorEntity(code:
errCode,
message:
"无效的请求");
//
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025厂级安全培训考试试题含完整答案【一套】
- 2025年生产经营负责人安全培训考试试题打印
- 2025年班组安全培训考试试题【考点精练】
- 2025租赁土地种植蔬菜合同
- 2025年依据劳动合同规定合法解雇员工
- 2025宁夏租房合同范本下载
- 2025年垃圾前端收转装备项目建议书
- 2025科技公司合作合同范本
- 2025劳动合同与保密协议
- 2025贷款服务合同金融合同模板
- 短引线保护引出线保护以及T区保护
- 完美公司玛丽艳美的观念
- 浙摄影版(2020)信息技术三年级上册第一课认识计算机(课件)
- 第七讲-信息技术与大数据伦理问题-副本
- 校园安全常识测试题卷
- 建筑用玻璃ccc标准
- 第一课中国人民站起来了
- 眼科门诊病历
- 彝文《指路经》课件
- 《神经系统的传导通路》课件
- 基本农田划定技术规程(TDT1032-2011)
评论
0/150
提交评论