Dio的简单封装

Flutter dio 3.2.2 简单封装思路(网络层) dio 库进行封装思路,Flutter 网络层 阅读详情
dio的简单使用
dio

一个适合Dart的强大的Http Client,它支持拦截器,全局配置,FormData,请求取消,文件下载,超时等。

Sample Use

pubspec.yaml 导入

dependencies:
  dio: ^3.0.10
import 'package:dio/dio.dart';
void getHttp() async {
  try {
    Response response = await Dio().get("http://www.google.com");
    print(response);
  } catch (e) {
    print(e);
  }
}

下面是简单用法,来自dio 官方使用:

Get
Response response;
Dio dio = new Dio();
response = await dio.get("/test?id=12&name=wendu");
print(response.data.toString());
// Optionally the request above could also be done as
response = await dio.get("/test", queryParameters: {"id": 12, "name": "wendu"});
print(response.data.toString());
Post
response = await dio.post("/test", data: {"id": 12, "name": "wendu"});

Multiple Concurrent Requests

执行多个并发请求

response = await Future.wait([dio.post("/info"), dio.get("/token")]);

下载文件:

response = await dio.download("https://www.google.com/", "./xx.html");

Get response stream:

Response<ResponseBody> rs = await Dio().get<ResponseBody>(url,
 options: Options(responseType: ResponseType.stream), // set responseType to `stream`
);
print(rs.data.stream); //response stream

Get response with bytes:

Response<List<int>> rs = await Dio().get<List<int>>(url,
 options: Options(responseType: ResponseType.bytes), // // set responseType to `bytes`
);
print(rs.data); // List<int>

Sending FormData:

FormData formData = new FormData.fromMap({
    "name": "wendux",
    "age": 25,
  });
response = await dio.post("/info", data: formData);

Uploading multiple files to server by FormData:

FormData.fromMap({
    "name": "wendux",
    "age": 25,
    "file": await MultipartFile.fromFile("./text.txt",filename: "upload.txt"),
    "files": [
      await MultipartFile.fromFile("./text1.txt", filename: "text1.txt"),
      await MultipartFile.fromFile("./text2.txt", filename: "text2.txt"),
    ]
});
response = await dio.post("/info", data: formData);

Listening the uploading progress:

response = await dio.post(
  "http://www.dtworkroom.com/doris/1/2.0.0/test",
  data: {"aa": "bb" * 22},
  onSendProgress: (int sent, int total) {
    print("$sent $total");
  },
);

Post binary data by Stream:

// Binary data
List<int> postData = <int>[...];
await dio.post(
  url,
  data: Stream.fromIterable(postData.map((e) => [e])), //create a Stream<List<int>>
  options: Options(
    headers: {
      Headers.contentLengthHeader: postData.length, // set content-length
    },
  ),
);

还有Dio APIs,Request Options ,Response Schema,Interceptors #,Cookie Manager

我比较懒,就不CV了,

简单封装:
class HttpHelper {
  static final HttpHelper _instance = HttpHelper._internal();

  static HttpHelper get instance => _instance;
  // Use the factory keyword when implementing a constructor that doesn’t always create a new instance of its class.
  // For example, a factory constructor might return an instance from a cache, or it might return an instance of a subtype.
  factory HttpHelper() {
    return _instance;
  }
  HttpHelper._internal() {
    if (dio == null) {
      var options = BaseOptions(
        connectTimeout: 15000,
        receiveTimeout: 15000,
        responseType: ResponseType.plain,
        /*   validateStatus: (status) {
          // 不使用http状态码判断状态,使用AdapterInterceptor来处理(适用于标准REST风格)
          return true;
        },*/
        baseUrl: host,
      );
      dio = Dio(options);
    }
  } //private constructor
  Dio dio;
  Dio baseDio() {
    return dio;
  }

  static const String host = "https://xxxx";

  Future getHttp(String url) async {
    try {
      Response response = await dio.get(url);
      if (response.statusCode == HttpStatus.ok) {
        print(response.data);
        print("success:$response");
        return jsonDecode(response.data);
      }
    } on DioError catch (e) {
      if (e.response != null) {
        print(e.response.data);
        print(e.response.headers);
        print(e.response.request);
      } else {
        // Something happened in setting up or sending the request that triggered an Error
        print(e.request);
        print(e.message);
      }
    }
  }

  Future postHttp(String url, Map<String, dynamic> map) async {
    try {
      Response response = await dio.post(url, queryParameters: map);
      print(response);
    } catch (e) {
      print(e);
    }
  }

  Future<Response> postForm(String url, Map<String, dynamic> map) async {
    FormData formData = new FormData.fromMap(map);
    Response response = await dio.post(url, data: formData);
    return response;
  }

  Future<T> request<T>(String url,
      {String method = "get",
      Map<String, dynamic> map,
      Options options,
      Function(String error) onError}) async {
    var option = options;
    if (option != null) {
      option.method = method;
    } else {
      option = Options(method: method);
    }
    try {
      Response response =
          await dio.request(url, queryParameters: map, options: option);
      return jsonDecode(response.data.toString());
//      return jsonDecode(response.data.toString());
    } on DioError catch (e) {
      String msg = HandleError.getFinalException(e);
      onError(msg);
      //Future.error(e) 无返回
//      return Future.error(e);
      return null;
    }
  }
}


class HandleError {
  static String getFinalException(DioError dioError) {
    print("HandleError DioError:  $dioError");
    switch (dioError.type) {
      case DioErrorType.CANCEL:
        return "Request Cancel";
      case DioErrorType.CONNECT_TIMEOUT:
        return "CONNECT TIMEOUT";
      case DioErrorType.SEND_TIMEOUT:
        return 'Send Time Out';
      case DioErrorType.RESPONSE:
        return "Server Incorrect Status";
      case DioErrorType.RECEIVE_TIMEOUT:
        return "Receive Time Out";
      case DioErrorType.DEFAULT:
        String msg = 'UnKnown';
        Log.v("Handle Error DEFAULT", dioError.error);
        if (dioError.error != null) {
          if (dioError.error is SocketException) {
            msg = "网络连接异常";
          } else {
            msg = dioError.message;
          }
        }
        return msg;
    }
    return "UnKnown";
  }
}

使用:
  Future<dynamic> getLoginInfo(String url,String account, String password,
      {Function onError}) async {
    Map map = {};
    map["user_name"] = account;
    map["pass"] = password;
    print(map);
    var loginData = await HttpHelper.instance
        .request(url, method: "post", map: map, onError: onError);
//    print(loginData);
    print(TAG + "$loginData");
    return loginData;
  }

参考:Flutter网络请求之dio的初步使用

Flutter Dio

Flutter中的http网络请求

CANopen PDO 配置實戰:3步完成0x1800-0x1A00物件字典映射與事件觸發 本文详细解析CANopen PDO配置实战,通过3个关键步骤完成0x1800-0x1A00对象字典映射与事件触发设置。重点介绍COB-ID位域解析、映射参数配置及事件触发优化,帮助工程师实现工业自动化设备间毫秒级实时数据交换,提升系统通信效率。 阅读详情

相关推荐

ubuntu18.04安装gtsam过程及报错error: invalid initialization of reference of type ‘const std::vector<bool>&’

这里建议从这个链接下,不要从官网下,可能会有版本冲突 2.安装依赖 3.编译 报错: 1. error: invalid initialization of reference of type ‘const std::vector&’ from expression of type ‘const std::vector’ 124 | const std::vector& mask() const { retur...

qq_35102059的博客 2912

Flutter之Dio封装+实例(自己梳理)

Dio封装,Dio拦截器

weixin_43244083的博客 6629

FFmpeg实战:SEI自定义数据在RTMP推流中的高效嵌入

本文深入探讨了如何利用FFmpeg在RTMP推流中高效嵌入SEI自定义数据。通过将SEI比作与视频帧同步的“小纸条”,文章详细解析了H.264码流中SEI的结构与位置,并提供了命令行与API编程两种实战方法,帮助开发者实现直播答题、AI元数据回传等场景下的帧级精准数据同步。

weixin_29304021的博客 325

Flutter之dio请求封装

大家在使用dio的时候 一般会在取得服务端返回后再用entity对象解析,会显得麻烦一点,我们通过自己定义的Basebean基类,然后在封装http返回数据时统一用基类对象解析。在实际使用时可以简便很多,大大提高开发效率。作者:林晓峰。

DTCloud 2684

ROS+Gazebo仿真入门:用TurtleBot3模拟扫地机器人全流程

本文详细介绍了如何利用ROS和Gazebo仿真平台,以TurtleBot3 Waffle Pi模型为核心,从零搭建并运行一个虚拟扫地机器人的全流程。内容涵盖仿真环境搭建、世界与机器人模型解析,并重点演示了SLAM建图、自适应蒙特卡罗定位以及全局与局部路径规划等核心算法实战,为机器人算法开发与验证提供了高效、低成本的解决方案。

sre5engineer的博客 1087

CTF全能工具箱ProV2:集成AI与94GB离线资源库,打造无网环境下的智能解题流水线

CTF全能工具箱ProV2是一款专为线下CTF比赛设计的All-in-One离线解决方案。它集成了94GB的庞大离线资源库,涵盖Web、逆向、Pwn等全方向工具链与知识库,并创新性地内置了本地AI大模型,可在断网环境下提供智能解题辅助,实现从信息收集到漏洞利用的智能流水线作业,极大提升比赛效率。

weixin_29240343的博客 422

Future.wait使用

场景一: 当多个异步任务执行完成之后才继续执行下面的操作。例如步骤二的参数需要从步骤一获取结果。 Future.wait接受一个Future数组参数,只有数组中所有Future都执行成功后,才会触发then的成功回调,只要有一个Future执行失败,就会触发错误回调。下面,我们通过模拟Future.delayed来模拟两个数据获取的异步任务,等两个异步任务都执行成功时,将两个异步任务的结果拼接打印出来,创建一个test.dart 文件内容如下: main(){ Future.wait([ .

欢迎来到“無昂博奥”的博客 4528

华为CNA VRM搭建(使用vmware worfstartion搭建)

华为CNA和VRM在 vmware workstation安装使用

weixin_70595351的博客 1810

Flutter 学习 之 DIO4.0 的封装

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等…网址在右边 → [dio]

Eqiqi的博客 2162

Eplan2022 复制已有的宏文件生成新的原理图宏文件

Eplan2022 新建原理图宏文件

haier123888的博客 1万+

在SAP系统中,公司间关联交易(Intercompany Transactions)或内部往来主要有三种经典的实现模式。这些模式的选择取决于企业的业务复杂度、自动化需求以及对实时性的要求

SAP系统中公司间关联交易的三种实现模式分析:1)手工记账模式(FB60/FB70)适用于低频交易,灵活性高但易出错;2)SD/MM跨公司销售采购模式(VA01/VF01/ME21N)适用于真实业务流转,业务财务集成度高;3)自动清算模式(F.13/ICR)适合高频交易集团企业,支持实时自动对账。关键成功要素包括正确配置贸易伙伴字段、统驭科目及专用凭证类型。建议根据企业规模、业务复杂度及自动化需求选择合适模式,其中大型集团优先考虑自动对账方案以确保合并报表准确性。

金牌架构师 552

Flutter Dio 库的简单封装

dio 库Flutter 中是比较流行的网络请求库。其中在拦截器可以拦截请求,响应以及错误。第二个就是Http_config。第一个HttpRequest。第三个 自定义的拦截器。

github_36850997的博客 3550

选择的 Python 解释器无效,请尝试更改解释器以启用 IntelliSense、Lint 分析和调试等功能。请查看输出,详细了解解释器无效的原因。

摘要:在VS Code中配置Anaconda Python解释器时若出现"解释器无效"错误,可通过修改用户设置解决。具体步骤:1) 按Ctrl+Shift+P打开命令面板;2) 搜索并打开用户设置JSON文件;3) 添加conda路径配置项,示例格式为"python.condaPath": "D:\\Anaconda\\setup\\Scripts\\conda.exe";4) 同时启用环境激活选项"python.terminal.act

猿小白的博客 844

flutter dio的简单使用以及简单封装

到这里就可以运行一下,理想效果是:点击一下请求数据按钮,调用provider的getHello方法,然后请求一个demo接口,返回一个hello字符,通过notifyListeners()更新从而显示到页面的Text上。flutter再简单dio再好用,也禁不住这么个造法啊~做安卓开发的你每次请求都new一个Retrofit或者OkHttp你试试,保证敲你狗头!这里还是StatelessWidget,状态我暂时是打算全扔到provider里去管理,所以现在莫慌,接下来整provider。

weixin_44928783的博客 421

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Flutter Dio http简单封装与使用

Flutter Dio http简单封装与使用dio简单封装配置类接口地址类本地缓存读取工具类简单使用使用相关包 初次封装版本,后续更新完善。不足的地方欢迎提供意见,非常乐意学习请教。 dio简单封装 import 'dart:convert'; import 'dart:io'; import 'package:dio/adapter.dart'; import 'package:dio/dio.dart'; import 'package:yunxiaobao/utils/shared_util.dar

qq_43726671的博客 1360

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Flutter Dio网络网络请求简单封装

参考资源:https://github.com/po1arbear/Flutter-Net/blob/master/lib/http_manager.dart dio版本:dio: ^3.0.9 Dio工具类完整代码 import 'package:dio/dio.dart'; import '../api/apis.dart'; import 'result_data.dart'; ...

白煜墨的博客 1086

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Flutter - dio 简单二次封装

### demo 地址: https://github.com/iotjin/jh_flutter_demo Flutter Dio简单二次封装和自定义Header Flutter Dio二次封装 Flutter Dio封装与使用 Flutter 封装 dio,支持 Restful Api Flutter 网络请求框架封装 结构 apis 文件配置API 地址 dio_utils 文件是对dio的封装 error_handle 文件是异常处理 http_utils 项目接口请求 管理类 .

iotjin的专栏 6370

flutterdio_Flutter - dio 简单封装

结构apis 文件配置API 地址dio_utils 文件是对dio的封装error_handle 文件是异常处理http_utils 项目接口请求 管理类 ,(最终是通过调用这个文件进行网络请求)log_utils 日志打印的一个第三方, 可加可不加ps: 暂时没有加拦截器结构调用import 'package:jh_flutter_demo/http/http_utils.dart';Http...

weixin_39670511的博客 420

flutter 对dio进行简单的二次封装

前言 在项目中,我们往往要对第三方框架进行二次封装,目的在于减小项目对第三方框架的依赖,当第三方框架出现不兼容或者严重bug以至于我们需要更换第三方框架时,我们只需要在封装的地方更改第三方框架,而不需要在整个项目中进行更改。 下面我们封装对dio进行简单的二次封装 代码 import 'dart:ffi'; import 'package:dio/dio.dart'; import 'package:flutter/material.dart'; typedef onSuccess(dynamic da

qq_44756582的博客 845

Flutter 网络请求之基于dio的简单封装

dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cookie管理、文件上传/下载、超时、自定义适配器等。本文是基于dio库的简单二次封装,以适应我们平常开发中常用的get请求和post请求。 添加依赖 dependencies: dio: ^2.1.0 dio封装 首先,对dio进行初始化。这里使用工厂构造函数创建DioUtil,在Dart中,当实现一个使用 factory 关键词修饰的构造函数时,这个构造函数不必创建类的新实.

迦南的专栏 2340

Flutter:网络请求 Dio简单封装及请求实例和注意问题

flutter中网络请求一般使用 Dio库,下面我就来基于Dio库做一下简单封装和使用实例以及遇到的问题。 具体请去官网l了解:https://pub.dev/packages/dio 首先在项目的 pubspec.yaml文件中 引入相关库: # 网络请求 dio: ^3.0.10 # cookie 管理 dio_cookie_manager: ^1.0.0 Dio是一个强大的Dart Http请求库,支持Restful API、FormData、拦截器、请求取消、Cook...

zhangyiminsunshine的博客 1590

dio设置自定义post请求_Flutter Dio简单二次封装和自定义Header

话不多说自己看代码封装的比较简单,比较适合入门学习Dio。import 'package:dio/dio.dart';import 'Api.dart';/** 封装 restful 请求** GET、POST、DELETE、PATCH* 主要作用为统一处理相关事务:* - 统一处理请求前缀;* - 统一打印请求信息;* - 统一打印响应信息;* - 统一打印报错信息;*/class Di...

weixin_39562615的博客 480

[Flutter3] 记录Dio的简单封装(一)

的时候, 直接通过返回值的状态, 来处理各个情况,不用在 try{}catch{}里面各写一遍处理逻辑,直接同步获取了请求的结果,通过 ResponseEntity 来处理本次请求的各项情况(如上4图)处理, 这里的catch不再直接抛出, 用ResponseEntity来统一做返回格式处理。data 的处理, 稍后补上, 先走通请求…提供了 toString/ toLog函数 , 用于查看请求/返回/状态码/请求参数等。提供了 tag, 用于处理请求的不同情况。比如上图,就是直接调用的封装的API。

iOSTianNan的博客 1236

Flutter使用第三方Dio库进行简单的网络请求封装;Flutter网络请求使用

Flutter网络请求封装;Flutter原始请求使用;基于dart调用第三方Dio库进行网络请求封装;Flutter学习

weixin_49855711的博客 436

Flutter 怎么联网?Dio 网络库封装实战 (拦截器/Token刷新),像发邮件一样简单

本文介绍了Flutter中的网络请求基础,通过类比发送邮件形象说明了网络请求的工作原理。主要内容包括: 网络请求概念:如同发送邮件的过程,包含请求发送、等待响应和处理数据三个步骤 HTTP通信基础: 添加http依赖库 提供GET和POST请求的代码示例 演示如何处理响应数据和异常 功能实现: 构建包含按钮、加载指示器和数据显示的界面 实现获取单条数据、提交数据和加载列表的功能 包括状态管理、JSON解析和错误处理等关键环节 文章通过实际代码演示了Flutter中进行网络请求的标准流程和最佳实践。

👨‍💻 12年全栈老兵 | 擅长把复杂的代码逻辑翻译成“人话” | 只讲听得懂的技术故事 🚀 1176

Flutter网络请求Dio库的使用及封装

主要介绍Flutter网络请求第三方库Dio并实现了对Dio的简单封装及使用。

WEB前端李志杰 8794
上一篇: Android APP设置为Launcher 桌面 onCreate启动两次
下一篇: 使用 Hilt 实现依赖项注入
K_Hello
博客等级 码龄12年 33粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值