Flutter Dio网络请求

Dart packages
  1. 网络请求使用dio.dart
  2. 数据解析使用json_serializable和json_annotation
  3. 创建.g.dart使用build_runner 使用方法
  4. 监听事件使用 event_bus.dart
  5. Dart packages地址
文件相关
  1. PXAdress.dart 请求地址相关
  2. PXRequest.dart 具体请求类
  3. PXResultModel 请求数据对象
  4. YYRequestManager 请求管理类
  5. YYResultCode 状态码
  6. YYResultErrorEvent错误时间类
  7. YYResultModel基础数据对象
  8. YYConfig配置文件
配合界面使用
// 界面使用
  void _requestData() async {
    UserInfo userInfo = await PXRequest.px_getuser();
    setState(() {
      _userInfo = userInfo;
    });
  }

dependencies:
  flutter:
    sdk: flutter

  flutter_spinkit: "^2.1.0"  # load more loading
  dio: 1.0.6  #无网络请求
  json_annotation: ^1.2.0 #json_serializable助手

dev_dependencies:
  flutter_test:
    sdk: flutter

  build_runner: ^1.0.0  #创建.g.dart
  json_serializable: ^1.5.1  #序列化json
import 'package:dio/dio.dart';
import 'package:connectivity/connectivity.dart';

import 'dart:collection';

import 'package:ly_app/net/YYResultModel.dart';
import 'package:ly_app/net/YYResultCode.dart';
import 'package:ly_app/config/YYConfig.dart';

class YYRequestManager {
  static String baseUrl = ""; 
  static Map<String, String> baseHeaders = {
    "packageName":"com.puxin.financePlanner",
    "appName":"",
    "version":"1.8.7.3",
    "os":"ios",
    "channel":"appStore",
    "platform":"11.1999998092651",
    "model":"",
    "factory":"apple",
    "screenSize":"(0.0, 0.0, 375.0, 667.0)",
    "clientId":"15444",
    "token":"7fc30ec2206ec3135ca9d33d11406b36b048e4950836a678c4642e492",
    "sign":"",
    "pid":"pid",
    "registrationId":"pid",
  };

  static const CONTENT_TYPE_JSON = "application/json";
  static const CONTENT_TYPE_FORM = "application/x-www-form-urlencoded";
  static Map optionParams = {
    "timeoutMs": 15000,
    "token": null,
    "authorizationCode": null,
  };

  static requestPost(url, params, {noTip = false}) async {
    Options option = new Options(method: "post");
    return await requestBase(url, params, baseHeaders, option, noTip: noTip);
  }

  static requestBase(url, params, Map<String, String>header, Options option, {noTip = false}) async {
    // 判断网络
    var connectivityResult = await (new Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.mobile) {

    } else if (connectivityResult == ConnectivityResult.wifi) {
      
    } else if (connectivityResult == ConnectivityResult.none){
      return YYResultModel(YYResultErrorEvent(YYResultCode.NETWORK_ERROR, "请检查网络"), false, YYResultCode.NETWORK_ERROR);
    }

    //处理请求头
    Map<String, String> headers = new HashMap();
    if (header!=null) {
      headers.addAll(header);
    }

    //options处理
    if (option != null) {
      option.headers = headers;
    } else{
      option = new Options(method: "get");
      option.headers = headers;
    }
    option.baseUrl = baseUrl;
    option.connectTimeout = 15000;

    var dio = new Dio();
    Response response;
    try {
      response = await dio.request(url, data: params, options: option);
    } on DioError catch (error) {
      // 请求错误处理
      Response errorResponse;
      if (error.response != null) {
        errorResponse = error.response;
      } else {
        errorResponse = new Response(statusCode: 666);
      }
      // 超时
      if (error.type == DioErrorType.CONNECT_TIMEOUT) {
        errorResponse.statusCode = YYResultCode.NETWORK_TIMEOUT;
      }
      // debug模式才打印
      if (YYConfig.DEBUG) {
        print('请求异常: ' + error.toString());
        print('请求异常url: ' + url);
        print('请求头: ' + option.headers.toString());
        print('method: ' + option.method);
      }
      // 返回错误信息
      return new YYResultModel(YYResultCode.errorHandleFunction(errorResponse.statusCode, error.message, noTip), false, errorResponse.statusCode);
     };

    // debug模式打印相关数据
    if (YYConfig.DEBUG) {
      print('请求url: ' + url);
      print('请求头: ' + option.headers.toString());
      if (params != null) {
        print('请求参数: ' + params.toString());
      }
      if (response != null) {
        print('返回参数: ' + response.toString());
      }
    }

    try {
      if (response.statusCode == 200 || response.statusCode == 201) {
        return new YYResultModel(response.data, true, YYResultCode.SUCCESS, headers: response.headers);
      }
    } catch (error) {
      print(error.toString() + url);
      return new YYResultModel(response.data, false, response.statusCode, headers: response.headers);
    }
    return new YYResultModel(YYResultCode.errorHandleFunction(response.statusCode, "", noTip), false, response.statusCode);
  }
}
import 'YYRequestManager.dart';
import 'YYResultModel.dart';

import 'package:ly_app/Model/UserInfo.dart';

import 'PXResultModel.dart';

class PXRequest {

  static px_getuser() async {
    YYResultModel model = await YYRequestManager.requestPost("/employee/getuser", null);
    
    PXResultModel px_model = PXResultModel.init(model.data);

    UserInfo userInfo = UserInfo.fromJson(px_model.result);

    return userInfo;
  }
}

class YYResultModel {
  var data;
  bool success;
  int code;
  var headers;

  YYResultModel(this.data, this.success, this.code, {this.headers});
}

class PXResultModel {
  String message;
  var result;
  int returnCode;
  String token;

  PXResultModel(this.message, this.result, this.returnCode, this.token);

  static PXResultModel init(Map json) {
    return PXResultModel(json["message"], json["result"], json["returnCode"], json["token"]);
  }
}
import 'package:event_bus/event_bus.dart';

class YYResultCode {
  ///网络错误
  static const NETWORK_ERROR = -1;

  ///网络超时
  static const NETWORK_TIMEOUT = -2;

  ///网络返回数据格式化一次
  static const NETWORK_JSON_EXCEPTION = -3;

  static const SUCCESS = 200;

  static final EventBus eventBus = new EventBus();

  static errorHandleFunction(code, message, noTip) {
    if(noTip) {
      return message;
    }
    eventBus.fire(new YYResultErrorEvent(code, message));
    return message;
  }
}
class YYResultErrorEvent {
  final int code;

  final String message;

  YYResultErrorEvent(this.code, this.message);
}

class PXAdress {
  static getuser() {
    return "";
  }
}

class YYConfig {
  static bool DEBUG = true;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容