flutter 开发一个应用 3,使用dio

涉及一个联网应用,少不了http相关的东西了,dio就封装了网络功能.pub里搜索dio,说明也详细,使用简单.

参考了干货官方的示例,我把应用的http修改了,使用dio的.

_GankJsonListPageState里的修改:
loadData() async {
    String dataURL = "http://gank.io/api/today";

    HttpResponse httpResponse = await HttpClient.instance.get(dataURL);
    setState(() {
      gankToday = GankToday.fromJson(httpResponse.data);
      length = gankToday.beans.length;
      print("length:${gankToday.category}, content:${gankToday.items.length}");
    });
  }
建立一个返回类:
class HttpResponse {
  int code;
  var data;
  bool isSuccess;

  HttpResponse(this.data, this.isSuccess, this.code);
}

添加工具类:
class HttpClient {
  static HttpClient get instance => _getInstance();
  static HttpClient _instance;
  Dio dio;

  HttpClient._init() {
    if (dio == null) {
      //dio.interceptors.add(HttpLogInterceptor());

      // 或者通过传递一个 `options`来创建dio实例
      Options options = new Options(
          //baseUrl: "https://www.xx.com/api",
          connectTimeout: 5000,
          receiveTimeout: 3000);
      dio = new Dio();
    }
  }

  static HttpClient _getInstance() {
    if (_instance == null) {
      _instance = new HttpClient._init();
    }
    return _instance;
  }

  Future get(url, {params, header}) async {
    ///Headers
    Map<String, String> headers = HashMap();
    if (header != null) {
      headers.addAll(header);
    }

    ///Options
    Options option = new Options();
    option.headers = headers;
    option.method = 'get';

    //Response response;
    //response = await dio.get("/test", options: option);
    //print(response.data.toString());
    return request(url, options: option);
  }

  Future post(url, {params, header}) async {
    ///Headers
    Map<String, String> headers = HashMap();
    if (header != null) {
      headers.addAll(header);
    }

    ///Options
    Options option = new Options();
    option.headers = headers;
    option.method = 'post';
    return request(url, options: option);
  }

  Future postForm(url, {params, header}) async {
    FormData formData = new FormData.from({
      "name": "wendux",
      "age": 25,
      //"file1": new UploadFileInfo(new File("./upload.txt"), "upload1.txt")
      //"file2": new UploadFileInfo(new File("./upload.txt"), "upload2.txt")
    });

    Response response;
    response = await dio.post("/info", data: formData);
  }

  Future<HttpResponse> request(url, {options, params, header}) async {
    Response response;

    ///dio request
    try {
      response = await dio.request(url, data: params, options: options);
    } on DioError catch (e) {
      Response errorResponse = e.response ?? Response();
      if (e.type == DioErrorType.CONNECT_TIMEOUT) {
        errorResponse.statusCode = 503;
      }
      return HttpResponse(e.message, false, errorResponse.statusCode);
    }

    ///result
    try {
      if (response.statusCode == 200 || response.statusCode == 201) {
        return HttpResponse(response.data, true, 200);
      }
    } catch (e) {
      print("params:$params, headers:$header");
      print("net error:${e.toString()}");
      return HttpResponse(e.toString(), false, response.statusCode);
    }

    print("some error:");
    return HttpResponse("net work error", false, response.statusCode);
  }
}

这样就完成了,现在的文件是:

.

pub文件:

version: 1.0.0+1

environment:
  sdk: ">=2.2.2 <3.0.0"

dependencies:
  flutter:
    sdk: flutter

  # The following adds the Cupertino Icons font to your application.
  # Use with the CupertinoIcons class for iOS style icons.
  cupertino_icons: ^0.1.2
  english_words: ^3.1.5
  json_annotation: 3.0.0
  http: 0.12.0+2
  cached_network_image: 1.1.1

  dio: 2.1.13

dev_dependencies:
  flutter_test:
    sdk: flutter
  json_serializable: 3.2.0

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值