目录:

  • DioManager:Dio辅助类
  • NWMethod:请求方法,get、post等
  • NWApi:大家都知道
  • EntityFactory:json转换辅助工厂,把json转为T
  • BaseEntity:数据基类,返回的参数为 {“code”: 0, “message”: “”, “data”: {}}
  • BaseListEntity:数据基类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 = new List<T>();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<String, dynamic> 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<T>// method:请求方法,NWMethod.POST等// path:请求地址// params:请求参数// success:请求成功回调// error:请求失败回调Future requestList<T>(NWMethod method, String path, {Map<String, dynamic> 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));}}

提取请求错误处理方法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<String, dynamic> 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<T>// method:请求方法,NWMethod.POST等// path:请求地址// params:请求参数// success:请求成功回调// error:请求失败回调Future requestList<T>(NWMethod method, String path, {Map<String, dynamic> 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: "无效的请求");
//            }
//            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);}}}
}

使用:

// 返回 LoginEntity
DioManager().request<LoginEntity>(NWMethod.POST,NWApi.loginPath,params: {"account": "421789838@qq.com", "password": "123456"},success: (data) {print("success data = $data"});}, error: (error) {print("error code = ${error.code}, massage = ${error.message}");}
);// 返回 List<LoginEntity>
DioManager().requestList<LoginEntity>(NWMethod.POST,NWApi.queryListJsonPath,params: {"account": "421789838@qq.com", "password": "123456"},success: (data) {print("success data = $data"});}, error: (error) {print("error code = ${error.code}, massage = ${error.message}");}
);

作者:头发还没秃
链接:https://segmentfault.com/a/1190000021537855

Flutter Dio二次封装相关推荐

  1. Flutter Dio的简易封装和demo

    flutter_net_demo 一个简单的flutter dio的封装, 包括: 日志打印, 网络进度, 返回json转bean, get post upload方法的封装, 简易可直接运行的dem ...

  2. Flutter - dio 简单二次封装

    demo 地址: https://github.com/iotjin/jh_flutter_demo Flutter Dio简单二次封装和自定义Header Flutter Dio二次封装 Flutt ...

  3. Flutter(五)Dio接口请求二次封装加Header及MD5加密

    系列阅读 Flutter(一) 安装部署与认识Dart语言 Flutter(二)Android集成Flutter项目并实现跳转到 Flutter 界面 Flutter(三)Flutter与Androi ...

  4. Flutter —— dio

    Flutter -- dio 1. 关于import 2. pubspec 3. Dio 4. 替换项目三方库 1. 关于import import 中 as关键字来给他起了个别名来避免类名.方法名冲 ...

  5. Flutter Dio包网络请求抓包解决方案

    在Flutter中进行网络请求时,我们可以使用的库有3个,即Http请求库.HttpClient请求库和Dio请求库(详细介绍请参考:Flutter开发之Http网络请求),使用得最多的就是Dio请求 ...

  6. Glide二次封装库的使用

    更多代码可以查询本人GitHub:欢迎阅读,star点起来.  Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...

  7. 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装

    Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...

  8. Android 应用程序集成Google 登录及二次封装

    谷歌登录API:  https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...

  9. vue全家桶 ---axios的使用和二次封装

    1.前提基础 本文在vue项目搭建的基础上,vue-router路由配置的基础上,对vue项目中axios的使用进行介绍. 2.axios的使用以及拦截器的设置. 安装axios cnpm i axi ...

最新文章

  1. 钉钉api 获取 accesstoken_低代码快速对接钉钉日程
  2. 述职答辩提问环节一般可以问些什么_2020上海市职称评审答辩注意事项
  3. 前台jsp页面向后台传汉字出现乱码问题解决办法
  4. unicode字符大全可复制_说说Excel不可见字符的那些事
  5. Linux 7 关闭、禁用防火墙服务
  6. 如何使用 volatile, synchronized, final 进行线程间通信
  7. 西瓜书boosting learning 集成的错误率推导
  8. (Josephus )约瑟夫环问题 C语言实现
  9. springboot高校学生健康打卡系统的设计与实现毕业设计源码021009
  10. mac下如何解压7z
  11. html中输出 u263c,《 JavaScript程序设计》—— 第三章 数据
  12. 进程间的通信(Linux)
  13. 单车骑行红叶谷70KM
  14. VisionPro初始化 - C#
  15. 计算机10进制化2进制在线,二进制转十进制
  16. android---加速传感器
  17. windows10 安装gpu版本TensorFlow脑壳疼自我记录
  18. matplotlib绘图库
  19. 数据结构-Treap(树堆) 详解
  20. 【JS继承】JS继承之寄生式继承

热门文章

  1. INA226使用之程序与模块测试
  2. 3个5相乘列乘法算式_初中数学 | 必考的21个知识点,开学预习必备!
  3. python实现分析你和你对象的聊天记录词云图
  4. SpringBoot实现用户统一管理与单点登陆
  5. 记录下自己在淘宝摸索出的领红包位置
  6. 索尼sw2刷android wear,SmartWatch2 apk下载|SmartWatch2 SW2软件安卓版下载 v1.6.31 - 跑跑车安卓网...
  7. CSR BC57E687B蓝牙模块方案 现货供应
  8. Mirror 常用组件
  9. 中国进口废钢铁问题研究
  10. http://blog.csdn.net/heli007/article/details/7279022