【移动应用开发技术】如何在Flutter中实现Dio的二次封装_第1页
【移动应用开发技术】如何在Flutter中实现Dio的二次封装_第2页
【移动应用开发技术】如何在Flutter中实现Dio的二次封装_第3页
【移动应用开发技术】如何在Flutter中实现Dio的二次封装_第4页
【移动应用开发技术】如何在Flutter中实现Dio的二次封装_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】如何在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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论