Flutter Dio二次封装
目录:
- 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二次封装相关推荐
- Flutter Dio的简易封装和demo
flutter_net_demo 一个简单的flutter dio的封装, 包括: 日志打印, 网络进度, 返回json转bean, get post upload方法的封装, 简易可直接运行的dem ...
- Flutter - dio 简单二次封装
demo 地址: https://github.com/iotjin/jh_flutter_demo Flutter Dio简单二次封装和自定义Header Flutter Dio二次封装 Flutt ...
- Flutter(五)Dio接口请求二次封装加Header及MD5加密
系列阅读 Flutter(一) 安装部署与认识Dart语言 Flutter(二)Android集成Flutter项目并实现跳转到 Flutter 界面 Flutter(三)Flutter与Androi ...
- Flutter —— dio
Flutter -- dio 1. 关于import 2. pubspec 3. Dio 4. 替换项目三方库 1. 关于import import 中 as关键字来给他起了个别名来避免类名.方法名冲 ...
- Flutter Dio包网络请求抓包解决方案
在Flutter中进行网络请求时,我们可以使用的库有3个,即Http请求库.HttpClient请求库和Dio请求库(详细介绍请参考:Flutter开发之Http网络请求),使用得最多的就是Dio请求 ...
- Glide二次封装库的使用
更多代码可以查询本人GitHub:欢迎阅读,star点起来. Glide二次封装库源码 前言 为什么选择Glide? Glide 轻量级 速度快 可以根据所需加载图片的大小自动适配所需分辨率的图 支 ...
- 高德地图markevents_GitHub - mingxuWang/Map: 高德地图API二次封装
Map组件设计文档 组件设计目的 分析当前各业务方向(销售端.商城.数据可视化.TMS)内地图相关应用的地图功能使用情况,封装Map组件供给各业务向进行使用. 将高德地图API进行二次封装,降低地图相 ...
- Android 应用程序集成Google 登录及二次封装
谷歌登录API: https://developers.google.com/identity/sign-in/android/ 1.注册并且登录google网站 https://accounts. ...
- vue全家桶 ---axios的使用和二次封装
1.前提基础 本文在vue项目搭建的基础上,vue-router路由配置的基础上,对vue项目中axios的使用进行介绍. 2.axios的使用以及拦截器的设置. 安装axios cnpm i axi ...
最新文章
- 钉钉api 获取 accesstoken_低代码快速对接钉钉日程
- 述职答辩提问环节一般可以问些什么_2020上海市职称评审答辩注意事项
- 前台jsp页面向后台传汉字出现乱码问题解决办法
- unicode字符大全可复制_说说Excel不可见字符的那些事
- Linux 7 关闭、禁用防火墙服务
- 如何使用 volatile, synchronized, final 进行线程间通信
- 西瓜书boosting learning 集成的错误率推导
- (Josephus )约瑟夫环问题 C语言实现
- springboot高校学生健康打卡系统的设计与实现毕业设计源码021009
- mac下如何解压7z
- html中输出 u263c,《 JavaScript程序设计》—— 第三章 数据
- 进程间的通信(Linux)
- 单车骑行红叶谷70KM
- VisionPro初始化 - C#
- 计算机10进制化2进制在线,二进制转十进制
- android---加速传感器
- windows10 安装gpu版本TensorFlow脑壳疼自我记录
- matplotlib绘图库
- 数据结构-Treap(树堆) 详解
- 【JS继承】JS继承之寄生式继承
热门文章
- INA226使用之程序与模块测试
- 3个5相乘列乘法算式_初中数学 | 必考的21个知识点,开学预习必备!
- python实现分析你和你对象的聊天记录词云图
- SpringBoot实现用户统一管理与单点登陆
- 记录下自己在淘宝摸索出的领红包位置
- 索尼sw2刷android wear,SmartWatch2 apk下载|SmartWatch2 SW2软件安卓版下载 v1.6.31 - 跑跑车安卓网...
- CSR BC57E687B蓝牙模块方案 现货供应
- Mirror 常用组件
- 中国进口废钢铁问题研究
- http://blog.csdn.net/heli007/article/details/7279022