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 ...
最新文章
- 较传统AGV优势几何?AMR机器人产业格局将变
- python 装饰器 生成器 迭代器和闭包
- python如何读取csv文件列表页_每25行读取一个csv文件,并使用python传递到列表
- bfd联动 cisco_以太链路的接口备份和BFD联动
- VS恢复调试时出现的确认对话框
- python计算累计收益率的函数,在Python中计算累积密度函数的导数
- 用联发科芯片的手机能升级鸿蒙吗,华为鸿蒙系统降临!首批升级手机确定,联发科芯片被放弃?...
- spss中的aic值计算_常用SPSS数据处理方法,你都会吗?
- 关于VLAN划分的项目案例
- 在CSDN发布付费资源
- 计算机绘图培训心得,学习cad制图心得体会
- 实战制作U盘工具去除XP系统管理员密码
- 房产中介管理系统,房产中介预约看房系统,看房预约系统毕设作品
- 操作系统 哲学家进餐问题
- 关于博客笔记大汇总,持续更新迭代
- C# NPOI 导出Excel
- 「文献」杂合基因组的策略思路
- 【GO MICRO V3】protoc-gen-micro 生成proto代码
- 小丸子学Hadoop系列之——hbase备份与恢复
- vim setting
热门文章
- 水很深的深度学习|Task 01
- 警惕!程序员万字揭露被空姐骗到香港做传销的来龙去脉!
- .dwg转换为.svg
- php 当地天气预报,PHP调用全国天气预报数据接口查询天气示例
- 剪贴板占用计算机的内存,王朝知道我提了几个问题后,电脑就说内存不足,然后死机,怎么办?...
- 在UMAP图上标识我们感兴趣的基因所在的类群(单细胞数据)
- 预制墙板一般包括哪些类型?
- 122. 买卖股票的最佳时机 II
- 唐宇迪学习笔记20:聚类算法——DBSCAN
- 智能网联汽车 V2X 系统预警应用功能测试与评价方法