demo 地址: https://github.com/iotjin/jh_flutter_demo

Flutter Dio简单二次封装和自定义Header
Flutter Dio二次封装
Flutter Dio封装与使用
Flutter 封装 dio,支持 Restful Api
Flutter 网络请求框架封装

最新版添加了intercept.dart拦截器文件,做了空安全适配,其余代码也稍有不同,请前往GitHub查看最新代码

结构

apis 文件配置API 地址
dio_utils 文件是对dio的封装
error_handle 文件是异常处理
http_utils 项目接口请求 管理类 ,(最终是通过调用这个文件进行网络请求)
log_utils 日志打印的一个第三方, 可加可不加

ps: 暂时没有加拦截器

调用

import 'package:jh_flutter_demo/http/http_utils.dart';HttpUtils.PostRequest(APIType.Login,{"userName": _name, "pwd": _pwd}, success: (data) {}, fail: (code) {});

apis

class APIs {//url 前缀static const String apiPrefix =
"https://www.fastmock.site/mock/1010b262a743f0b06c565c7a31ee9739/root";//登录接口static String login = "/login";
}//接口类型,依次往下加
enum APIType {Login,GetPage,
}
//使用:APITypeValues[APIType.Login]
const APITypeValues = {APIType.Login: "/login",APIType.GetPage: "/getPageArrDic"
};

dio_utils

import 'dart:convert';import 'package:dio/dio.dart';
import 'package:connectivity/connectivity.dart';import 'apis.dart';
import 'log_utils.dart';
import 'error_handle.dart';const int _connectTimeout = 15000; //15s
const int _receiveTimeout = 15000;
const int _sendTimeout = 10000;typedef Success<T> = Function(T data);
typedef Fail = Function(int code, String msg);
class DioUtils {// default optionsstatic const String TOKEN = '';static Dio _dio;// 创建 dio 实例对象static Dio createInstance() {if (_dio == null) {/// 全局属性:请求前缀、连接超时时间、响应超时时间var options = BaseOptions(/// 请求的Content-Type,默认值是"application/json; charset=utf-8"./// 如果您想以"application/x-www-form-urlencoded"格式编码请求数据,/// 可以设置此选项为 `Headers.formUrlEncodedContentType`,  这样[Dio]就会自动编码请求体.
//        contentType: Headers.formUrlEncodedContentType, // 适用于post form表单提交responseType: ResponseType.json,validateStatus: (status) {// 不使用http状态码判断状态,使用AdapterInterceptor来处理(适用于标准REST风格)return true;},baseUrl: APIs.apiPrefix,
//        headers: httpHeaders,connectTimeout: _connectTimeout,receiveTimeout: _receiveTimeout,sendTimeout: _sendTimeout,);_dio = new Dio(options);}return _dio;}// 清空 dio 对象static clear() {_dio = null;}// 请求,返回参数为 T// method:请求方法,Method.POST等// path:请求地址// params:请求参数// success:请求成功回调// error:请求失败回调static Future request<T>(Method method, String path, dynamic params,{Success success, Fail fail}) async {try {//没有网络var connectivityResult = await (new Connectivity().checkConnectivity());if (connectivityResult == ConnectivityResult.none) {_onError(ExceptionHandle.net_error, '网络异常,请检查你的网络!', fail);return;}Dio _dio = createInstance();Response response = await _dio.request(path,data: params, options: Options(method: MethodValues[method]));if (response != null) {if (success != null) {success(response.data);}} else {_onError(ExceptionHandle.unknown_error, '未知错误', fail);}} on DioError catch (e) {
//      LogUtils.print_('请求出错:' + e.toString());final NetError netError = ExceptionHandle.handleException(e);_onError(netError.code, netError.msg, fail);}}
}/// 自定义Header
Map<String, dynamic> httpHeaders = {'Accept': 'application/json,*/*','Content-Type': 'application/json','token': DioUtils.TOKEN
};void _onError(int code, String msg, Fail fail) {if (code == null) {code = ExceptionHandle.unknown_error;msg = '未知异常';}LogUtils.print_('接口请求异常: code: $code, msg: $msg');if (fail != null) {fail(code, msg);}
}Map<String, dynamic> parseData(String data) {return json.decode(data) as Map<String, dynamic>;
}enum Method { GET, POST, DELETE, PUT, PATCH, HEAD }
//使用:MethodValues[Method.POST]
const MethodValues = {Method.GET: "get",Method.POST: "post",Method.DELETE: "delete",Method.PUT: "put",Method.PATCH: "patch",Method.HEAD: "head",
};

error_handle

import 'dart:io';import 'package:dio/dio.dart';class ExceptionHandle {static const int success = 200;static const int success_not_content = 204;static const int unauthorized = 401;static const int forbidden = 403;static const int not_found = 404;static const int net_error = 1000;static const int parse_error = 1001;static const int socket_error = 1002;static const int http_error = 1003;static const int timeout_error = 1004;static const int cancel_error = 1005;static const int unknown_error = 9999;static NetError handleException(DioError error) {if (error is DioError) {if (error.type == DioErrorType.DEFAULT ||error.type == DioErrorType.RESPONSE) {dynamic e = error.error;if (e is SocketException) {return NetError(socket_error, '网络异常,请检查你的网络!');}if (e is HttpException) {return NetError(http_error, '服务器异常!');}if (e is FormatException) {return NetError(parse_error, '数据解析错误!');}return NetError(net_error, '网络异常,请检查你的网络!');} else if (error.type == DioErrorType.CONNECT_TIMEOUT ||error.type == DioErrorType.SEND_TIMEOUT ||error.type == DioErrorType.RECEIVE_TIMEOUT) {//  连接超时 || 请求超时 || 响应超时return NetError(timeout_error, '连接超时!');} else if (error.type == DioErrorType.CANCEL) {return NetError(cancel_error, '取消请求');} else {return NetError(unknown_error, '未知异常');}} else {return NetError(unknown_error, '未知异常');}}}class NetError {int code;String msg;NetError(this.code, this.msg);
}

http_utils

import 'package:jh_flutter_demo/jh_common/widgets/jh_progress_hud.dart';import 'apis.dart';
import 'dio_utils.dart';
import 'log_utils.dart';typedef Success<T> = Function(T data);
typedef Fail = Function(int code);class HttpUtils {//登录static void login<T>(parameters, {Success success,Fail fail,}) {
//    DioUtils.request(Method.POST, APIs.login, parameters,
//        success: success, fail: fail);post(APIs.login, parameters, success: success, fail: fail);}//分页加载数据static void getNewPageList<T>(parameters, {Success success,Fail fail,}) {post(APIs.getPage, parameters, success: success, fail: fail);}//GETstatic void GetRequest<T>(APIType apiType,parameters, {Success success,Fail fail,}) {post(APITypeValues[apiType], parameters, success: success, fail: fail);}//POSTstatic void PostRequest<T>(APIType apiType,parameters, {Success success,Fail fail,}) {post(APITypeValues[apiType], parameters, success: success, fail: fail);}/********************************* 分割线 ********************************///get 请求static void get<T>(String url,parameters, {Success success,Fail fail,}) {_request(Method.GET, url, parameters, success: success, fail: fail);}//post 请求static void post<T>(String url,parameters, {Success success,Fail fail,}) {_request(Method.POST, url, parameters, success: success, fail: fail);}//_request 请求static void _request<T>(Method method,String url,parameters, {Success success,Fail fail,}) {/// restful 请求处理/// /base/search/hist/:user_id        user_id=27/// 最终生成 url 为     /base/search/hist/27parameters.forEach((key, value) {if (url.indexOf(key) != -1) {url = url.replaceAll(':$key', value.toString());}});
//    //参数处理
//    LogUtils.d("--------- parameters ---------");
//    LogUtils.d("$parameters");DioUtils.request(method, url, parameters, success: (result) {
//      LogUtils.d("--------- response ---------");
//      LogUtils.d('$result');
//      LogUtils.print_(result);if (result['code'] == 200) {if (success != null) {success(result);}} else {//其他状态,弹出错误提示信息JhProgressHUD.showText(result['msg']);}}, fail: (code, msg) {JhProgressHUD.showError(msg);if (fail != null) {fail(code);}});}
}

Flutter - dio 简单二次封装相关推荐

  1. dio设置自定义post请求_Flutter Dio简单二次封装和自定义Header

    话不多说自己看代码封装的比较简单,比较适合入门学习Dio. import 'package:dio/dio.dart'; import 'Api.dart'; /* * 封装 restful 请求 * ...

  2. AFN的简单二次封装

    可用于登陆,注册,修改密码,获得手机验证码. 首先导入AFN第三方库 NetWorkTool.h // NetWorkTool.h // 网络请求 // // Created by 丁云飞 on 15 ...

  3. vue+elementui 简单二次封装步骤条显示大事记

    效果图: 实现:页面 <template><div class="evnets"><el-steps><el-step v-for=&qu ...

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

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

  5. Flutter Dio的简易封装和demo

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

  6. 二次封装图片第三方框架——简单工厂模式的运用

    CSDN首发地址: 前言 写在前头,这篇博客对于老司机们没什么多大的意义,老司机们就不用看了,对于新手还是有很大实用价值的. 平时在项目中,你们有没有遇到这样的情况,比如之前项目是使用开源框架Imag ...

  7. flutter 项目实战二 网络请求

    本项目借用 逛丢 网站的部分数据,仅作为 flutter 开发学习之用. 逛丢官方网址:https://guangdiu.com/ flutter windows开发环境设置 flutter 项目实战 ...

  8. flutter scrollview_简单易上手的Flutter学习指南App,2020一起来玩转Flutter吧~

    Flutter是谷歌的移动UI框架,可以快速在iOS.Android.Web和PC上构建高质量的原生用户界面. Flutter可以与现有的代码一起工作.在全世界,Flutter正在被越来越多的开发者和 ...

  9. Glide二次封装库的使用

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

最新文章

  1. Scott的ASP.net MVC框架系列文章之四:处理表单数据(2)
  2. 如何解读和在线绘制进化树?
  3. 粘贴铜箔简易实验电路制作
  4. rhel8手动安装mysql_RHEL8 CentOS8 下安装 MySQL 8.0亲测
  5. 教你怎样在电脑上建一个绝密目录
  6. iOS面试必看,最全梳理
  7. MFC SendMessage()函数传递字符串
  8. [CQOI2015]选数(杜教筛)
  9. bug经验-文件路径问题
  10. Oracle不打算修复这两个iPlanet信息泄漏和注入漏洞
  11. Tensorflow2.0:使用Keras自定义网络实战
  12. jdk list接口源码解析
  13. 阶段3 2.Spring_02.程序间耦合_1 编写jdbc的工程代码用于分析程序的耦合
  14. 《 剑指offer》 目录索引
  15. python下载网页中的pdf文件_Python下载PDF嵌入页面
  16. 【蓝桥杯Web】第十四届蓝桥杯(Web 应用开发)模拟赛 1 期-大学组 | 精品题解
  17. 一幅图理解计算机系统硬件组成
  18. python王者荣耀刷金币
  19. 行杂记之Zookeeper SessionTimeOut分析
  20. c语言字符串删掉小写字母

热门文章

  1. 微信小程序-实现两个按钮固定在页面底端且不随页面滑动(静态页面)
  2. 微信小程序仿网易音乐播放器项目
  3. STP——MSTP理论讲解
  4. 银狐小贷风控系统引领行业最前端
  5. Mac上最好用的BT下载工具——Folx
  6. python查天气预报_Python如何读取天气预报
  7. Vue中实现动态横向均匀排列块元素
  8. Java 模拟栈结构
  9. 【BZOJ3267】KC采花
  10. html语言 日期和星期,日期 时间 星期的html代码是什么代码