flutter網(wǎng)絡(luò)請求封裝一(Callback)

直接上代碼吧,拿走不謝!

import 'dart:convert';
import 'package:connectivity/connectivity.dart';
import 'package:dio/dio.dart';
import 'package:flutter_application_yiguan/utils/jq_utils.dart';
import 'package:fluttertoast/fluttertoast.dart';

/**
 * json在線生成model工具
 * https://caijinglong.github.io/json2dart/index_ch.html
 * 運行以下命令:
 * flutter packages pub run build_runner build
 * flutter packages pub run build_runner watch
 */

/// 請求完成回調(diào)方法
typedef CompleteCallback = void Function(DioError? error, dynamic result);

const String kNoConnectivityCode = '3001';

/// brief: 請求方式 枚舉值
/// 注意:Dart語言的枚舉不支持指定原始值
enum JQHttpType { get, post }

class JQBaseHttpRequest {
  /// JQHttpType type 請求方式
  /// String url      請求地址
  /// Map<String, String> httpHeader
  /// Map params      請求參數(shù)
  /// CompleteCallback completeCallback 請求完成回調(diào)
  static httpRequest({
    required String url,
    required JQHttpType type,
    Map<String, dynamic>? httpHeader,
    Map<String, dynamic>? params,
    CompleteCallback? completeCallback,
  }) async {
    JQUtils.printf('url-->$url');
    JQUtils.printf('params-->$params');

    /// 設(shè)置 Options
    Options option = Options();

    /// 請求方式
    option.method = (type != JQHttpType.post) ? 'GET' : 'POST';

    /// 設(shè)置 headers
    Map<String, dynamic> headers = new Map();
    if (httpHeader != null) {
      headers.addAll(httpHeader);
    }
    option.headers = headers;
    JQUtils.printf('option.headers---------->${option.headers}');

    /// 超時時間 15000毫秒ms(15秒)
    /// 發(fā)送超時
    option.sendTimeout = 15000;

    /// 接收超時
    option.receiveTimeout = 15000;

    var connectivityResult = await (new Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
      /// 沒有網(wǎng)絡(luò)
      RequestOptions requestOptions = RequestOptions(path: url);
      Response response = Response(
        data: {'status': kNoConnectivityCode, 'message': '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'},
        requestOptions: requestOptions,
        statusCode: 3001,
        statusMessage: '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常',
      );
      DioError error = DioError(
        response: response,
        requestOptions: RequestOptions(path: url),
        type: DioErrorType.other,
        error: Error.safeToString('當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'),
      );
      completeCallback!(error, null);

      /// 實際上返回的是response的data數(shù)據(jù)
      return response.data;
    } else {
      /// 有網(wǎng)絡(luò)
      Dio dio = new Dio();
      try {
        Response response = await dio.request(url,
            // data: params,
            queryParameters: params,
            options: option);
        JQUtils.printf('網(wǎng)絡(luò)請求成功');
        JQUtils.printf('-----------response----------');

        /// 打印headers
        JQUtils.printf('response.headers ------>');
        JQUtils.printf(response.headers);

        /// response是一個JSON對象
        JQUtils.printf('-----------data----------');

        /// 打印data
        JQUtils.printf('response.data ------>');
        JQUtils.printf('json格式 == ' + json.encode(response.data));

        if (completeCallback != null) {
          completeCallback(null, response.data);
        }

        /// 實際上返回的是response的data數(shù)據(jù)
        return response.data;
      } on DioError catch (e) {
        /// 請求異常處理
        /// 延時0.3秒執(zhí)行返回,處理和loading的重合
        Future.delayed(Duration(milliseconds: 300), () {
          /// error存在,底層封裝統(tǒng)一顯示提示
          Fluttertoast.showToast(
            msg: "網(wǎng)絡(luò)請求異常",
            gravity: ToastGravity.CENTER,
          );
          JQUtils.printf('延時0.3s執(zhí)行');
        });
        JQUtils.printf('網(wǎng)絡(luò)請求異常======');
        JQUtils.printf(e);
        JQUtils.printf('e.response====');
        JQUtils.printf(e.response);
        JQUtils.printf('e.response.data');
        JQUtils.printf(e.response?.data);
        if (completeCallback != null) {
          completeCallback(e, null);
        }

        /// 實際上返回的是response的data數(shù)據(jù)
        return e.response?.data;
      }
    }
  }

  /// 文件下載
  static httpDownload({
    required String url,
    required String localSavePath,
    required JQHttpType type,
    Map<String, dynamic>? httpHeader,
    Map<String, dynamic>? params,
    CancelToken? cancelToken,
    ProgressCallback? progressCallback,
    CompleteCallback? completeCallback,
  }) async {
    JQUtils.printf('url-->$url');
    JQUtils.printf('params-->$params');

    /// 設(shè)置 Options
    Options option = Options();

    /// 請求方式
    option.method = (type != JQHttpType.post) ? 'GET' : 'POST';

    /// 設(shè)置 headers
    Map<String, dynamic> headers = new Map();
    if (httpHeader != null) {
      headers.addAll(httpHeader);
    }
    option.headers = headers;
    JQUtils.printf('option.headers---------->${option.headers}');
    JQUtils.printf('params---------->${params}');

    /// 超時時間 15000毫秒ms(15秒)

    /// 發(fā)送超時
    option.sendTimeout = 15000;

    /// 接收超時
    option.receiveTimeout = 15000;

    var connectivityResult = await (new Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
      /// 沒有網(wǎng)絡(luò)
      RequestOptions requestOptions = RequestOptions(path: url);
      Response response = Response(
        data: {'status': kNoConnectivityCode, 'message': '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'},
        requestOptions: requestOptions,
        statusCode: 3001,
        statusMessage: '當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常',
      );
      DioError error = DioError(
        response: response,
        requestOptions: RequestOptions(path: url),
        type: DioErrorType.other,
        error: Error.safeToString('當(dāng)前網(wǎng)絡(luò)不可用,請檢查網(wǎng)絡(luò)是否正常'),
      );
      completeCallback!(error, null);

      /// 實際上返回的是response的data數(shù)據(jù)
      return response;
    } else {
      /// 有網(wǎng)絡(luò)
      Dio dio = new Dio();
      try {
        Response response = await dio.download(url, localSavePath,
            queryParameters: params,
            options: option,
            onReceiveProgress: progressCallback == null
                ? null
                : (int count, int total) {
                    if (total == -1) {
                      /// 不知道進度的默認(rèn)50%
                      total = count * 2;
                    }
                    progressCallback(count, total);
                  },
            cancelToken: cancelToken);
        response.extra = <String, dynamic>{"localPath": localSavePath};

        JQUtils.printf('網(wǎng)絡(luò)請求成功');
        JQUtils.printf('-----------response----------');

        /// 打印headers
        JQUtils.printf('response.headers ------>');
        JQUtils.printf(response.headers);

        /// response是一個JSON對象
        JQUtils.printf('-----------data----------');

        /// 打印data
        JQUtils.printf('response.data ------>');
        JQUtils.printf(response.data);
        JQUtils.printf('localSavePath = ' + localSavePath);

        if (completeCallback != null) {
          // 下載文件這里,把文件的本地存儲地址返回
          completeCallback(null, localSavePath);
        }

        /// 實際上返回的是response的data數(shù)據(jù)
        return response;
      } on DioError catch (e) {
        /// 請求異常處理
        /// 延時0.3秒執(zhí)行返回,處理和loading的重合
        Future.delayed(Duration(milliseconds: 300), () {
          /// error存在,底層封裝統(tǒng)一顯示提示
          Fluttertoast.showToast(
            msg: "網(wǎng)絡(luò)請求異常",
            gravity: ToastGravity.CENTER,
          );
          JQUtils.printf('延時0.3s執(zhí)行');
        });
        JQUtils.printf('網(wǎng)絡(luò)請求異常');
        JQUtils.printf(e);
        JQUtils.printf(e.response);
        if (completeCallback != null) {
          completeCallback(e, null);
        }

        /// 實際上返回的是response的data數(shù)據(jù)
        return e.response;
      }
    }
  }
}


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容