Flutter

Flutter中对Dio的简单封装与使用

2020-09-06  本文已影响0人  阿毛呀_

不管是在前端还是在移动端的开发中,除了各式UI工具库的使用,使用最多的应该就是涉及到与后端交互的网络请求工具库了。在Flutter这边目前用到最多的应该就是Dio了。为了在项目中更方便的使用Dio,都会对其进行一些简单的封装。今天就记录一下自己的封装过程

导入dio

首先在pubspec.yaml中导入Dio库,然后get package。

创建Dio封装工具类

创建一个工具类,用于我们后续进行封装以及的使用。下面简单的说一下

class DioManager {
  // 单利
  static DioManager _instance ;
  static DioManager getInstance() {
    if(_instance == null) {
      _instance = DioManager() ;
    }
    return _instance ;
  }
}

进行一些对应的配置

Dio dio = Dio();
DioManager() {
   dio.options.baseUrl = baseUrl ; //BaseURL的配置
   dio.options.connectTimeout = 5000 ; //请求超时限制
   dio.options.receiveTimeout = 3000 ;
   dio.interceptors.add(LogInterceptor(requestBody: true));//是否开启请求日志
    //  dio.interceptors.add(CookieManager(CookieJar()));//缓存相关类,具体设置见https://github.com/flutterchina/cookie_jar
  }

Get请求

//get请求
get(String url, FormData params, Function successCallBack,
      Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, 'get', params, errorCallBack);
 }

Post请求

//post请求
  post(String url, params, Function successCallBack,
      Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, "post", params, errorCallBack);
  }

Post不带请求体的请求

//post请求,没有请求体
  postNoParams(
      String url, Function successCallBack, Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, "post", null, errorCallBack);
  }

请求的主体

// 请求的主体方法
_requestHttpMethod(String url , Function successCallBack , [String method , FormData params , Function errorCallBack]) async {
    Response response ;
    try {
      if (method == 'get') {
        if (params != null) {
          response = await dio.get(url,
              queryParameters: Map.fromEntries(params.fields));
        } else {
          response = await dio.get(url);
        }
      } else if (method == 'post') {
        if (params != null && params.fields.isNotEmpty) {
          response = await dio.post(url, data: params);
        } else {
          response = await dio.post(url);
        }
      }
    } on DioError catch (error){
      // 请求错误处理
      Response errorResponse;
      if (error.response != null) {
        errorResponse = error.response;
      } else {
        errorResponse = new Response(statusCode: 201);
      }
      _error(errorCallBack, error.message);
      return '';
    }

    String dataStr = json.encode(response.data);
    Map<String, dynamic> dataMap = json.decode(dataStr);
    //至于返回的status就看自己公司怎么约定的了
    if (dataMap == null || dataMap['status'] != 200) {
      _error(errorCallBack, dataMap['msg'].toString());
    } else if (successCallBack != null) {
      successCallBack(dataMap);
    }
  }
  // 请求错误返回
  _error(Function errorCallBack, String error) {
    if (errorCallBack != null) {
      errorCallBack(error);
    }
  }
以上就是对dio简单的封装了。下面讲一下使用了:
FormData params = FormData.fromMap({
     'username':_username,
     'password':_password,
});

DioManager.getInstance().post(Url, params, (result){
    print(result);
    //请求成功需要做的事
    }, (error){
    ToastUtil.show(error);
   //失败后需要做的事
 });

当然每个项目对传参的格式可能有不一样的要求。那就需要自己根据需求来了。

下面是Dio封装的完整代码:
class DioManager {
  static DioManager _instance ;
  static DioManager getInstance() {
    if(_instance == null) {
      _instance = DioManager() ;
    }
    return _instance ;
  }

  Dio dio = Dio();
  DioManager() {
    dio.options.baseUrl = baseUrl ;
    dio.options.connectTimeout = 5000 ;
    dio.options.receiveTimeout = 3000 ;
    dio.interceptors.add(LogInterceptor(requestBody: true));
    //  dio.interceptors.add(CookieManager(CookieJar()));//缓存相关类,具体设置见https://github.com/flutterchina/cookie_jar
  }

  //get请求
  get(String url, FormData params, Function successCallBack,
      Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, 'get', params, errorCallBack);
  }
  //post请求
  post(String url, params, Function successCallBack,
      Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, "post", params, errorCallBack);
  }
  //post请求
  postNoParams(
      String url, Function successCallBack, Function errorCallBack) async {
    _requestHttpMethod(url, successCallBack, "post", null, errorCallBack);
  }
  // 请求的主体
  _requestHttpMethod(String url , Function successCallBack , [String method , FormData params , Function errorCallBack]) async {
    Response response ;
    try {
      if (method == 'get') {
        if (params != null) {
          response = await dio.get(url,
              queryParameters: Map.fromEntries(params.fields));
        } else {
          response = await dio.get(url);
        }
      } else if (method == 'post') {
        if (params != null && params.fields.isNotEmpty) {
          response = await dio.post(url, data: params);
        } else {
          response = await dio.post(url);
        }
      }
    } on DioError catch (error){
      // 请求错误处理
      Response errorResponse;
      if (error.response != null) {
        errorResponse = error.response;
      } else {
        errorResponse = new Response(statusCode: 201);
      }
      _error(errorCallBack, error.message);
      return '';
    }

    String dataStr = json.encode(response.data);
    Map<String, dynamic> dataMap = json.decode(dataStr);
    if (dataMap == null || dataMap['status'] != 200) {
      _error(errorCallBack, dataMap['msg'].toString());
    } else if (successCallBack != null) {
      successCallBack(dataMap);
    }
  }

  // 请求错误返回
  _error(Function errorCallBack, String error) {
    if (errorCallBack != null) {
      errorCallBack(error);
    }
  }
}

大概就这些了,也基本上能满足我日常的开发使用了。可能还有更好的方式。以后学习理解的更深刻了再回过头来重新写吧。

上一篇下一篇

猜你喜欢

热点阅读