目录:

  • 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. 较传统AGV优势几何?AMR机器人产业格局将变
  2. python 装饰器 生成器 迭代器和闭包
  3. python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表
  4. bfd联动 cisco_以太链路的接口备份和BFD联动
  5. VS恢复调试时出现的确认对话框
  6. python计算累计收益率的函数,在Python中计算累积密度函数的导数
  7. 用联发科芯片的手机能升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
  8. spss中的aic值计算_常用SPSS数据处理方法,你都会吗?
  9. 关于VLAN划分的项目案例
  10. 在CSDN发布付费资源
  11. 计算机绘图培训心得,学习cad制图心得体会
  12. 实战制作U盘工具去除XP系统管理员密码
  13. 房产中介管理系统,房产中介预约看房系统,看房预约系统毕设作品
  14. 操作系统 哲学家进餐问题
  15. 关于博客笔记大汇总,持续更新迭代
  16. C# NPOI 导出Excel
  17. 「文献」杂合基因组的策略思路
  18. 【GO MICRO V3】protoc-gen-micro 生成proto代码
  19. 小丸子学Hadoop系列之——hbase备份与恢复
  20. vim setting

热门文章

  1. 水很深的深度学习|Task 01
  2. 警惕!程序员万字揭露被空姐骗到香港做传销的来龙去脉!
  3. .dwg转换为.svg
  4. php 当地天气预报,PHP调用全国天气预报数据接口查询天气示例
  5. 剪贴板占用计算机的内存,王朝知道我提了几个问题后,电脑就说内存不足,然后死机,怎么办?...
  6. 在UMAP图上标识我们感兴趣的基因所在的类群(单细胞数据)
  7. 预制墙板一般包括哪些类型?
  8. 122. 买卖股票的最佳时机 II
  9. 唐宇迪学习笔记20:聚类算法——DBSCAN
  10. 智能网联汽车 V2X 系统预警应用功能测试与评价方法