美文网首页Flutter
Flutter中对Dio的简单封装与使用

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

作者: 阿毛呀_ | 来源:发表于2020-09-06 22:31 被阅读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);
        }
      }
    }
    

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

    相关文章

      网友评论

        本文标题:Flutter中对Dio的简单封装与使用

        本文链接:https://www.haomeiwen.com/subject/wyhhektx.html