首页 > 其他分享 >flutter最新封装Dio

flutter最新封装Dio

时间:2023-12-16 19:08:56浏览次数:27  
标签:case Dio return break path 封装 message data flutter

import 'dart:convert';
import 'package:becoin/Routers/Routes.dart';
import 'package:common_utils/common_utils.dart';
import 'package:dio/dio.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';


class Request {
  // 配置 Dio 实例
  static BaseOptions _options = BaseOptions(
    ///Api地址
    baseUrl: 'https://www.beacons.vip',
    ///打开超时时间
    connectTimeout: 50000,
    ///接收超时时间
    receiveTimeout: 30000,
  );

  // 创建 Dio 实例
  static Dio _dio = Dio(_options);
  
  // _request 是核心函数,所有的请求都会走这里
  static Future<T> _request<T>(String path,{String? method, Map? params, data}) async {
    // restful 请求处理
    if (params != null) {
      params.forEach((key, value) {
        if (path.indexOf(key) != -1) {
          path = path.replaceAll(":$key", value.toString());
        }
      });
    }
    LogUtil.v(data, tag: '发送的数据为:');
    try {
      Response response = await _dio.request(path,data: data, options: Options(method: method,contentType: Headers.formUrlEncodedContentType,));
      if (response.statusCode == 200 || response.statusCode == 201) {
        /// 格式化接收到的数据
        var data = jsonDecode(response.data);
        try {
          // return data;
          /// 如果状态吗不等于0,说明错误,则进行提示
          if (data['code'] == "1") {
            LogUtil.v(data['code'],tag: '服务器错误,状态码为:');
          } else if(data['code'] == "404"){
            return Future.error(data['msg']);
          }else {
            ///其他状态说明正常
            LogUtil.v(data,tag: '响应的数据为:');
            return data;
          }
        } catch (e) {
          LogUtil.v(e, tag: '解析响应数据异常1');
          return Future.error('解析响应数据异常2');
        }
      } else {
        LogUtil.v(response.statusCode, tag: 'HTTP错误,状态码为:');
        _handleHttpError(response.statusCode!);
        return Future.error('HTTP错误');
      }
    } on DioError catch (e, s) {
      return Future.error(_dioError(e));
    } catch (e, s) {
      return Future.error('未知异常');
    }
  }

  // 处理 Dio 异常
  static String _dioError(DioError error) {
    switch (error.type) {
      case DioErrorType.connectTimeout:
        return "网络连接超时,请检查网络设置";
        break;
      case DioErrorType.receiveTimeout:
        return "服务器异常,请稍后重试!";
        break;
      case DioErrorType.sendTimeout:
        return "网络连接超时,请检查网络设置";
        break;
      case DioErrorType.response:
        return "服务器异常,请稍后重试!";
        break;
      case DioErrorType.cancel:
        return "请求已被取消,请重新请求";
        break;
      case DioErrorType.other:
        return "网络异常,请稍后重试!";
        break;
      default:
        return "Dio异常";
    }
  }

  // 处理 Http 错误码
  static void _handleHttpError(int errorCode) {
    String message;
    switch (errorCode) {
      case 400:
        message = '请求语法错误';
        break;
      case 401:
        message = '未授权,请登录';
        break;
      case 403:
        message = '拒绝访问';
        break;
      case 404:
        message = '请求出错';
        break;
      case 408:
        message = '请求超时';
        break;
      case 500:
        message = '服务器异常';
        break;
      case 501:
        message = '服务未实现';
        break;
      case 502:
        message = '网关错误';
        break;
      case 503:
        message = '服务不可用';
        break;
      case 504:
        message = '网关超时';
        break;
      case 505:
        message = 'HTTP版本不受支持';
        break;
      default:
        message = '请求失败,错误码:$errorCode';
    }
    EasyLoading.showError(message);
  }

  static Future<T> get<T>(String path, {Map? params}) {
    return _request(path, method: 'get', params: params);
  }

  static Future<T> post<T>(String path, {Map? params, data}) {
    return _request(path, method: 'post', params: params, data: data);
  }
  // 这里只写了 get 和 post,其他的别名大家自己手动加上去就行
}

标签:case,Dio,return,break,path,封装,message,data,flutter
From: https://blog.51cto.com/u_16299651/8853254

相关文章

  • vue3+vite+js中二次封装axios
    一、安装axiosnpmiaxios二、文件结构涉及到的文件:utils/request.sjapi/index.js(可以根据不同页面在api文件下新建不同文件夹,方便管理)vite.config.js三、request.js对axios进行简单的二次封装importaxiosfrom"axios";constrequest=axios.create({//......
  • AndroidStudio设置密码可见不可见
    这里我们写一个在登录demo中常见的功能,当点击眼睛图片时,使密码可见或不可见,即形成一种保护,也防止了我们输入错误密码情况的出现,是很友好的一个功能。两张图片:睁眼:闭眼:大家记得复制粘贴到drawable.xml文件中。注意一下命名规则,推荐:see.png和nosee.png。然后,我们去写一下布局的代码:<L......
  • golang封装命令做pipe管道
    packagemainimport( "fmt" "io" "os/exec")funcmain(){ fmt.Println("vim-go") //pipeReader,pipeWriter:=io.Pipe() binPath:="../03-ncpk-nvm/nvm" binArgs:=[]string{ "-debug",......
  • ml.net例子笔记2-概念和Widnows AI Studio
    一机器学习和ml.net1Python机器学习库在Python中,工具和库的生态系统可以分为五个主要领域:数据处理数据可视化数值计算模型训练神经网络这可能不全,因为此外还有其他许多的库,它们负责其他任务,并专注于机器学习的一些特定领域,比如自然语言处理和图像识别。使用Python......
  • 将开源免费进行到底,ThreadX开源电脑端GUIBuilder图形开发工具GUIX Studio
    上个月微软刚刚宣布将ThreadXRTOS全家桶贡献给Eclipse基金会,免费供大家商用,宽松的MIT授权方式,就差这个GUIXStudio没有开源了,而且Windows还经常检索不到,并且也不提供离线包。1、软件包有点大,700MB,直接分享到百度云了:链接:https://pan.baidu.com/s/1tS8IDWrIXGiCTbHxwxEkDA  提......
  • Flutter 自带的搜索组件
    效果如下官方需要重写四个关键方法classsearchBarDelegateextendsSearchDelegate<String>{/*这个方法返回一个控件列表,显示为搜索框右边的图标按钮,这里设置为一个清除按钮,并且在搜索内容为空的时候显示建议搜索内容,使用的是showSuggestions(context)方法:*/@overrid......
  • 界面组件DevExpress VCL v23.2新功能预览 - 支持RAD Studio 12.0
    本文即将发布DevExpressVCL 下一个主要更新(v23.2),在之前的文章中(点击这里回顾>>)我们为大家介绍了新的工具提示、图表空间中的标签重叠等,本文将主要介绍DevExpressVCLv23.2中将支持的RADStudio12.0、增强的图像选择器、字体和自定义图标包等。新版即将发布,敬请期待哦~获取De......
  • Flutter开发之安卓打包,和获取签名相关信息,公钥值相关操作
    我们Flutter开发中,难免有些小朋友因需求要获取打包签名的一些相关信息,下面我们来讲一下怎么获取一生成签名文件我们打包安卓APK包需要先生成签名文件,需运行以下指令,生成签名文件keytool-genkey-v-keystoreGMT\_keystore.keystore-aliasGMT\_keystore-keyalgRSA-keysi......
  • Flutter技术基础
    技术基础语法主要是用dart,dart就是js和java的组合体,变量的声明,类,继承,构造函数,setget方法,以_开头的变量通常表示为私有变量。这意味着这个变量或者方法只能在当前Dart文件中访问,而不能被其他文件访问。一些集合包如map、list、set等等会用到的数据结构2.包管理:配置文件pubs......
  • 看不惯AI版权作品被白嫖!Stability AI副总裁选择了辞职,曾领导开发Stable Audio
    近日,OpenAI的各种大瓜真是让人吃麻了。而就在SamAltmam被开除前两天,可能没太多人注意到StabilityAI副总裁Newton—Rex因看不惯StabilityAI在版权保护上的行为选择辞职一事。Newton—Rex对音乐生成式AI的贡献Newton—Rex是生成式AI在音乐领域的发展进化过程中的关键人物之一。这位......