Flutter 集成dio

作者: 代瑶 | 来源:发表于2020-07-09 17:15 被阅读0次

首先我们去github 找到dio的介绍,稍微看下会发现确实是一个很强大的网络工具, 我们现在介绍下如何把它封装成我们项目常用的单例

https://github.com/flutterchina/dio/blob/master/README-ZH.md

yaml引入插件按照github介绍就好

这里我们注意, Dart语言不支持反射机制。所以我们将一个数据映射成entity需要用到这个插件。

image.png
import 'dart:convert';
import 'dart:io';

import 'package:dio/dio.dart';
//import 'package:fluttertoast/fluttertoast.dart';

class HttpGo {
  static const String _GET = "get";
  static const String _POST = "post";

  static const String _DATA = "data";
  static const String _CODE = "errCode";

  static HttpGo _instance;

  final String _baseURL = "http://www.dtworkroom.com/doris/1/2.0.0/";

  Dio _dio;

  static HttpGo getInstance() {
    if (_instance == null) {
      _instance = HttpGo();
    }
    return _instance;
  }

  HttpGo() {
    _dio = Dio(
      BaseOptions(
          baseUrl: _baseURL,
          connectTimeout: 5000,
          receiveTimeout: 100000,
//        headers: {"user-agent": "dio", "api": "1.0.0"},
          contentType: ContentType.json.toString(),
          responseType: ResponseType.plain),
    );

    _addHttpInterceptor(); //添加请求之前的拦截器
  }

  //get请求
  get(String url, Function successCallBack, {Map<String, dynamic> params, Function errorCallBack}) async {
    _requestHttp(url, successCallBack, _GET, params, errorCallBack);
  }

  //post请求
  post(String url, Function successCallBack, {Map<String, dynamic> params, Function errorCallBack}) async {
    _requestHttp(url, successCallBack, _POST, params, errorCallBack);
  }

  _requestHttp(String url, Function successCallBack, [String method, Map<String, dynamic> params, Function errorCallBack]) async {
    String errorMsg = '';
    int code;

    try {
      Response response;

      if (method == _GET) {
        if (params != null && params.isNotEmpty) {
          response = await _dio.get(url, queryParameters: params);
        } else {
          response = await _dio.get(url);
        }
      } else if (method == _POST) {
        if (params != null && params.isNotEmpty) {
          response = await _dio.post(url, data: params);
        } else {
          response = await _dio.post(url);
        }
      }

      code = response.statusCode;
      if (code != 200) {
        errorMsg = '错误码:' + code.toString() + ',' + response.data.toString();
        _error(errorCallBack, errorMsg);
        return;
      }

//      String dataStr = json.encode(response.data);
      Map<String, dynamic> dataMap = json.decode(response.data);
      if (dataMap != null && dataMap[_CODE] != 0) {
        errorMsg = '错误码:' + dataMap[_CODE].toString() + ',' + response.data.toString();
        _error(errorCallBack, errorMsg);
        return;
      }

      if (successCallBack != null) {
        successCallBack(dataMap[_DATA]);
      }
    } catch (exception) {
      _error(errorCallBack, exception.toString());
    }
  }

  _error(Function errorCallBack, String error) {
//    Fluttertoast.showToast(msg: error.toString(), toastLength: Toast.LENGTH_SHORT, gravity: ToastGravity.CENTER);
    if (errorCallBack != null) {
      errorCallBack(error);
    }
  }

  _addHttpInterceptor() {
    _dio.interceptors.add(InterceptorsWrapper(onRequest: (RequestOptions options) async {
      // 在请求被发送之前做一些事情
      return options; //continue
      // 如果你想完成请求并返回一些自定义数据,可以返回一个`Response`对象或返回`dio.resolve(data)`。
      // 这样请求将会被终止,上层then会被调用,then中返回的数据将是你的自定义数据data.
      //
      // 如果你想终止请求并触发一个错误,你可以返回一个`DioError`对象,或返回`dio.reject(errMsg)`,
      // 这样请求将被中止并触发异常,上层catchError会被调用。
    }, onResponse: (Response response) async {
      // 在返回响应数据之前做一些预处理
      return response; // continue
    }, onError: (DioError e) async {
      // 当请求失败时做一些预处理
      return e; //continue
    }));
  }
}


直接贴上我封装的dio 单例类。
创建一个DioTest类

import 'package:guoteng/generated/json/base/json_convert_content.dart';
import 'package:guoteng/util/dio/HttpGo.dart';

import 'model/entity_info_entity.dart';

main()   {
  HttpGo.getInstance().get("/test", (json) {
    EntityInfoEntity entity =  JsonConvert.fromJsonAsT<EntityInfoEntity>(json);
    print(entity.address);
  });
}

这里的EntityInfoEntity就是通过JsonBeanFactory来映射的。

代码编写完成~! 效果如下


image.png

相关文章

网友评论

    本文标题:Flutter 集成dio

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