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;
      }
    }
  }
}



相关文章
|
2月前
|
存储 缓存 JavaScript
Flutter 学习之封装 WebView
【10月更文挑战第24天】通过以上的探讨,我们可以看出,在 Flutter 中封装 WebView 是非常有必要的,它可以提高代码的复用性、增强可维护性、提供统一接口。在实际应用中,我们需要根据具体的需求和场景,选择合适的封装方法和技术,以实现更好的效果。
|
26天前
|
XML JSON 前端开发
一文带你了解 Flutter dio封装
一文带你了解 Flutter dio封装
143 1
|
2月前
|
存储 缓存 Dart
Flutter&鸿蒙next 封装 Dio 网络请求详解:登录身份验证与免登录缓存
本文详细介绍了如何在 Flutter 中使用 Dio 封装网络请求,实现用户登录身份验证及免登录缓存功能。首先在 `pubspec.yaml` 中添加 Dio 和 `shared_preferences` 依赖,然后创建 `NetworkService` 类封装 Dio 的功能,包括请求拦截、响应拦截、Token 存储和登录请求。最后,通过一个登录界面示例展示了如何在实际应用中使用 `NetworkService` 进行身份验证。希望本文能帮助你在 Flutter 中更好地处理网络请求和用户认证。
201 1
|
2月前
|
Dart UED 开发者
Flutter&鸿蒙next中的按钮封装:自定义样式与交互
在Flutter应用开发中,按钮是用户界面的重要组成部分。Flutter提供了多种内置按钮组件,但有时这些样式无法满足特定设计需求。因此,封装一个自定义按钮组件变得尤为重要。自定义按钮组件可以确保应用中所有按钮的一致性、可维护性和可扩展性,同时提供更高的灵活性,支持自定义颜色、形状和点击事件。本文介绍了如何创建一个名为CustomButton的自定义按钮组件,并详细说明了其样式、形状、颜色和点击事件的处理方法。
98 1
|
2月前
|
开发工具 UED
Flutter&鸿蒙next中封装一个输入框组件
本文介绍了如何创建一个简单的Flutter播客应用。首先,通过`flutter create`命令创建项目;接着,在`lib`目录下封装一个自定义输入框组件`CustomInput`;然后,在主应用文件`main.dart`中使用该输入框组件,实现简单的UI布局和功能;最后,通过`flutter run`启动应用。本文还提供了后续扩展建议,如状态管理、网络请求和UI优化。
112 1
|
2月前
|
开发工具
Flutter&鸿蒙next中封装一个列表组件
Flutter&鸿蒙next中封装一个列表组件
58 0
|
3月前
|
网络协议 Java 程序员
【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用
【网络】局域网LAN、广域网WAN、TCP/IP协议、封装和分用
54 2
|
2月前
|
Dart 安全 UED
Flutter&鸿蒙next中的表单封装:提升开发效率与用户体验
在移动应用开发中,表单是用户与应用交互的重要界面。本文介绍了如何在Flutter中封装表单,以提升开发效率和用户体验。通过代码复用、集中管理和一致性的优势,封装表单组件可以简化开发流程。文章详细讲解了Flutter表单的基础、封装方法和表单验证技巧,帮助开发者构建健壮且用户友好的应用。
92 0
|
3月前
|
JSON Dart 数据格式
flutter:文件操作与网络请求 (十五)
本文介绍了 Dart 语言中文件操作与网络请求的相关知识,包括 Future 的使用、异步请求的处理以及 async 和 await 的应用。通过示例代码展示了如何实现延时操作、处理网络请求及解析 JSON 数据。
|
3月前
|
网络协议 网络架构
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
【第三期】计算机网络常识/网络分层模型与数据包封装传输过程
72 0