flutter网络请求封装

简介: flutter网络请求封装

直接上代码吧,拿走不谢!

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
 */
/// 请求完成回调方法
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      请求参数
  /// CompleteCallback completeCallback 请求完成回调
  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');
    /// 设置 Options
    Options option = Options();
    /// 请求方式
    option.method = (type != JQHttpType.post) ? 'GET' : 'POST';
    /// 设置 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秒)
    /// 发送超时
    option.sendTimeout = 15000;
    /// 接收超时
    option.receiveTimeout = 15000;
    var connectivityResult = await (new Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
      /// 没有网络
      RequestOptions requestOptions = RequestOptions(path: url);
      Response response = Response(
        data: {'status': kNoConnectivityCode, 'message': '当前网络不可用,请检查网络是否正常'},
        requestOptions: requestOptions,
        statusCode: 3001,
        statusMessage: '当前网络不可用,请检查网络是否正常',
      );
      DioError error = DioError(
        response: response,
        requestOptions: RequestOptions(path: url),
        type: DioErrorType.other,
        error: Error.safeToString('当前网络不可用,请检查网络是否正常'),
      );
      completeCallback!(error, null);
      /// 实际上返回的是response的data数据
      return response.data;
    } else {
      /// 有网络
      Dio dio = new Dio();
      try {
        Response response = await dio.request(url,
            // data: params,
            queryParameters: params,
            options: option);
        JQUtils.printf('网络请求成功');
        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数据
        return response.data;
      } on DioError catch (e) {
        /// 请求异常处理
        /// 延时0.3秒执行返回,处理和loading的重合
        Future.delayed(Duration(milliseconds: 300), () {
          /// error存在,底层封装统一显示提示
          Fluttertoast.showToast(
            msg: "网络请求异常",
            gravity: ToastGravity.CENTER,
          );
          JQUtils.printf('延时0.3s执行');
        });
        JQUtils.printf('网络请求异常======');
        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数据
        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');
    /// 设置 Options
    Options option = Options();
    /// 请求方式
    option.method = (type != JQHttpType.post) ? 'GET' : 'POST';
    /// 设置 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秒)
    /// 发送超时
    option.sendTimeout = 15000;
    /// 接收超时
    option.receiveTimeout = 15000;
    var connectivityResult = await (new Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
      /// 没有网络
      RequestOptions requestOptions = RequestOptions(path: url);
      Response response = Response(
        data: {'status': kNoConnectivityCode, 'message': '当前网络不可用,请检查网络是否正常'},
        requestOptions: requestOptions,
        statusCode: 3001,
        statusMessage: '当前网络不可用,请检查网络是否正常',
      );
      DioError error = DioError(
        response: response,
        requestOptions: RequestOptions(path: url),
        type: DioErrorType.other,
        error: Error.safeToString('当前网络不可用,请检查网络是否正常'),
      );
      completeCallback!(error, null);
      /// 实际上返回的是response的data数据
      return response;
    } else {
      /// 有网络
      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) {
                      /// 不知道进度的默认50%
                      total = count * 2;
                    }
                    progressCallback(count, total);
                  },
            cancelToken: cancelToken);
        response.extra = <String, dynamic>{"localPath": localSavePath};
        JQUtils.printf('网络请求成功');
        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数据
        return response;
      } on DioError catch (e) {
        /// 请求异常处理
        /// 延时0.3秒执行返回,处理和loading的重合
        Future.delayed(Duration(milliseconds: 300), () {
          /// error存在,底层封装统一显示提示
          Fluttertoast.showToast(
            msg: "网络请求异常",
            gravity: ToastGravity.CENTER,
          );
          JQUtils.printf('延时0.3s执行');
        });
        JQUtils.printf('网络请求异常');
        JQUtils.printf(e);
        JQUtils.printf(e.response);
        if (completeCallback != null) {
          completeCallback(e, null);
        }
        /// 实际上返回的是response的data数据
        return e.response;
      }
    }
  }
}



相关文章
|
10月前
|
Android开发 iOS开发 容器
Flutter控件封装之轮播图Banner
Flutter中实现轮播图的方式有很多种,比如使用三方flutter_swiper,card_swiper等等,使用这些三方,可以很快很方便的实现一个轮播图展示,基本上也能满足我们日常的开发需求,如果说,想要一些定制化的操作,那么就不得不去更改源码或者自己自定义一个,自己定义的话,Flutter中提供了原生组件PageView,可以使用它很方便的来实现一个轮播图。
189 0
|
5天前
|
存储 缓存 开发框架
Flutter的网络请求:使用Dart进行HTTP请求的技术详解
【4月更文挑战第26天】了解Flutter网络请求,本文详述使用Dart进行HTTP请求
|
7月前
|
Dart API
带你读《深入浅出Dart》二十九、Flutter网络请求(1)
带你读《深入浅出Dart》二十九、Flutter网络请求(1)
|
7月前
|
XML JSON Dart
带你读《深入浅出Dart》二十九、Flutter网络请求(2)
带你读《深入浅出Dart》二十九、Flutter网络请求(2)
|
10月前
|
API Android开发
Flutter控件封装之视频进度条
视频控制器,三方所提供的样式,有时很难满足我们的需求,对于此情况,我们不得不在此基础上自行封装,今天所分享的文章就是一个很简单的控制器封装案例,包含了基本的播放暂停,全屏和退出全屏,以及时间和进度的展示,封装了事件回调以及各个属性的控制,基本上可以满足大部分的业务需求,即便不满足,大家也可以在此基础之上拓展。
137 0
|
10月前
|
Android开发 UED
Flutter控件之Tab选项卡封装
Tab选项卡,这是一个非常常见且权重很高的一个组件,随便打开一个App,比如掘金,如下图,首页顶部就是一个Tab选项卡,这个功能可以说,几乎每个App都会存在。
169 0
|
10月前
|
存储 Android开发
Flutter控件之图片Image封装
Flutter中偏偏原生的控件,少了很多需要又常用的属性,比如宽高,比如内外边距,又比如点击事件,如果不采取封装,视图的结构会一层嵌套一层,徒增很多的冗余代码,所以,为了简洁代码,还有为了拓展原生组件没有的属性,就不得不进行一次简单的封装,使其在调用的时候,可以很方便的实现某些功能。
|
10月前
|
API
Flutter控件之文本Text封装
文本Text比较简单,除了基类BaseWidget所提供的属性之外,又简单的扩展了部分属性,比如图文和富文本,都是系统原生的提供的,做了简单的封装。
|
10月前
|
API Android开发 容器
Flutter控件之基类Widget封装
基类的Widget主要确定以下几个方面,第一就是,自定义一个抽象类还是非抽象类,第二、继承方式,采取有状态还是无状态,第三、关于组件的点击方式,如何进行实现。
105 0
|
10月前
|
XML JSON Dart
《深入浅出Dart》Flutter网络请求
Flutter网络请求 网络请求是移动应用开发中常见的任务之一,Flutter提供了强大且易于使用的网络请求库,使得我们能够轻松地与服务器进行通信。我们将探讨不同类型的网络请求、错误处理、异步操作以及如何解析和处理响应数据。
150 0