扁平手机网站/百度客服

扁平手机网站,百度客服,有没有网站是免费做店招图片的,网站数据库转移在Flutter开发中,网络请求是必不可少的功能。为了简化代码、提高开发效率,我们通常会封装一个网络请求工具类。本文基于Dio库,详细介绍如何封装一个高效、灵活、易用的网络请求工具类,支持以下功能: 单例模式&#xf…

在Flutter开发中,网络请求是必不可少的功能。为了简化代码、提高开发效率,我们通常会封装一个网络请求工具类。本文基于Dio库,详细介绍如何封装一个高效、灵活、易用的网络请求工具类,支持以下功能:

  1. 单例模式:确保全局只有一个Dio实例,避免资源浪费。
  2. 动态配置:支持运行时动态修改baseUrlheaders等配置。
  3. 拦截器:内置日志拦截器,并支持添加自定义拦截器。
  4. 错误处理:提供详细的错误信息,支持自定义错误处理逻辑。
  5. 文件上传和下载:封装了文件上传和下载功能。
  6. 取消请求:支持取消正在进行的请求。
  7. 模块化设计:代码结构清晰,便于维护和扩展。

通过本文,你将学会如何封装一个功能强大的网络请求工具类,并直接应用到你的Flutter项目中。


代码实现

import 'package:dio/dio.dart';
import 'package:flutter/foundation.dart';class HttpUtil {// 单例模式static final HttpUtil _instance = HttpUtil._internal();factory HttpUtil() => _instance;HttpUtil._internal() {_init();}late Dio _dio;final List<Interceptor> _interceptors = []; // 自定义拦截器列表CancelToken _cancelToken = CancelToken(); // 用于取消请求// 初始化void _init() {_dio = Dio(BaseOptions(baseUrl: 'https://your-api-url.com', // 默认基础地址connectTimeout: const Duration(seconds: 5), // 连接超时时间receiveTimeout: const Duration(seconds: 5), // 接收数据超时时间headers: {'Content-Type': 'application/json; charset=UTF-8',},));// 添加默认拦截器_dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {if (kDebugMode) {print('Request: ${options.method} ${options.path}');}return handler.next(options);},onResponse: (response, handler) {if (kDebugMode) {print('Response: ${response.statusCode} ${response.data}');}return handler.next(response);},onError: (DioException e, handler) {if (kDebugMode) {print('Error: ${e.message}');}return handler.next(e);},));// 添加自定义拦截器for (var interceptor in _interceptors) {_dio.interceptors.add(interceptor);}}// 添加自定义拦截器void addInterceptor(Interceptor interceptor) {_interceptors.add(interceptor);_dio.interceptors.add(interceptor);}// 动态更新基础配置void updateBaseConfig({String? baseUrl,Duration? connectTimeout,Duration? receiveTimeout,Map<String, dynamic>? headers,}) {_dio.options.baseUrl = baseUrl ?? _dio.options.baseUrl;_dio.options.connectTimeout = connectTimeout ?? _dio.options.connectTimeout;_dio.options.receiveTimeout = receiveTimeout ?? _dio.options.receiveTimeout;_dio.options.headers = headers ?? _dio.options.headers;}// GET请求Future<Response> get(String path, {Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {return _request(path,method: 'GET',queryParameters: queryParameters,options: options,cancelToken: cancelToken,);}// POST请求Future<Response> post(String path, {dynamic data,Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {return _request(path,method: 'POST',data: data,queryParameters: queryParameters,options: options,cancelToken: cancelToken,);}// PUT请求Future<Response> put(String path, {dynamic data,Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {return _request(path,method: 'PUT',data: data,queryParameters: queryParameters,options: options,cancelToken: cancelToken,);}// DELETE请求Future<Response> delete(String path, {dynamic data,Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {return _request(path,method: 'DELETE',data: data,queryParameters: queryParameters,options: options,cancelToken: cancelToken,);}// 文件上传Future<Response> upload(String path, {required String filePath,Map<String, dynamic>? data,Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {final formData = FormData.fromMap({...data ?? {},'file': await MultipartFile.fromFile(filePath),});return _request(path,method: 'POST',data: formData,queryParameters: queryParameters,options: options,cancelToken: cancelToken,);}// 文件下载Future<Response> download(String urlPath,String savePath, {Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {try {final response = await _dio.download(urlPath,savePath,queryParameters: queryParameters,options: options,cancelToken: cancelToken ?? _cancelToken,);return response;} on DioException catch (e) {throw _handleError(e);}}// 通用请求方法Future<Response> _request(String path, {required String method,dynamic data,Map<String, dynamic>? queryParameters,Options? options,CancelToken? cancelToken,}) async {try {final response = await _dio.request(path,data: data,queryParameters: queryParameters,options: Options(method: method),cancelToken: cancelToken ?? _cancelToken,);return response;} on DioException catch (e) {throw _handleError(e);}}// 取消请求void cancelRequests({CancelToken? cancelToken}) {if (cancelToken == null) {_cancelToken.cancel('Request cancelled');_cancelToken = CancelToken(); // 重置CancelToken} else {cancelToken.cancel('Request cancelled');}}// 错误处理String _handleError(DioException e) {switch (e.type) {case DioExceptionType.connectionTimeout:return '连接超时';case DioExceptionType.sendTimeout:return '发送请求超时';case DioExceptionType.receiveTimeout:return '接收数据超时';case DioExceptionType.badResponse:return '服务器返回错误: ${e.response?.statusCode}';case DioExceptionType.cancel:return '请求已取消';case DioExceptionType.unknown:return '未知错误: ${e.message}';default:return '网络错误: ${e.message}';}}
}

使用示例

void fetchData() async {try {final response = await HttpUtil().get('/api/data');print('Data: ${response.data}');} catch (e) {print('Error: $e');}
}void uploadFile() async {try {final response = await HttpUtil().upload('/api/upload',filePath: '/path/to/file',);print('Upload Response: ${response.data}');} catch (e) {print('Error: $e');}
}void cancelRequest() {HttpUtil().cancelRequests();
}

总结

通过封装这样一个网络请求工具类,我们可以显著提高Flutter项目的开发效率,减少重复代码,同时增强代码的可维护性和扩展性。希望本文对你有所帮助

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/899171.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MyBatis-Plus(SpringBoot版)学习第一讲:简介入门案例

目录 1. MyBatis-Plus简介 1.1 简介 1.2 特性 1.3 支持的数据库 1.4 框架结构 1.5 代码及文档地址 2. 入门案例 2.1 开发环境 2.2 创建数据库及表 1. 创建表 2. 添加数据 2.3 创建SpringBoot工程 1. 初始化工程 2. 引入依赖 3. IDEA中安装lombok插件 ​编辑 2.4 编…

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

【PPO】小白的强化学习算法笔记

参考视频 零基础学习强化学习算法&#xff1a;ppo 基础概念 environment环境agent&#xff1a;智能体&#xff0c;玩游戏的你state&#xff1a;当前状态&#xff0c;observation看到的部分&#xff0c;有的游戏只能看见state的一部分action&#xff1a;agent做出的动作reward…

Flink介绍与安装

Apache Flink是一个在有界数据流和无界数据流上进行有状态计算分布式处理引擎和框架。Flink 设计旨在所有常见的集群环境中运行&#xff0c;以任意规模和内存级速度执行计算。 一、主要特点和功能 1. 实时流处理: 低延迟: Flink 能够以亚秒级的延迟处理数据流&#xff0c;非常…

深入解析 JVM 内存区域及核心概念

深入解析 JVM 内存区域及核心概念 Java 虚拟机&#xff08;JVM&#xff09;内部划分了多个内存区域&#xff0c;每个区域存储不同类型的数据并承担不同的职责。本文将详细介绍以下内容&#xff1a; 程序计数器&#xff1a;记录当前线程正在执行的字节码指令及其“行号”信息&a…

Java操作RabbitMQ

文章目录 Spring集成RabbitMQ1. AMQP&SpringAMQP2. SpringBoot集成RabbitMQ3. 模型work模型 4.交换机Fanout交换机Direct交换机Topic交换机 5.声明式队列和交换机基于API声明基于注解声明 6.消息转换器 Spring集成RabbitMQ 1. AMQP&SpringAMQP AMQP&#xff08;高级消…

【Excel使用技巧】某列保留固定字段或内容

目录 ✅ 方法一&#xff1a;使用 Excel 公式提取 body 部分 &#x1f50d; 解释&#xff1a; ✅ 方法二&#xff1a;批量处理整列数据 &#x1f6a8; 注意事项 &#x1f6a8; 处理效果 我想保留Excel某一列的固定内容&#xff0c;比如原内容是&#xff1a; thread entry i…

Kafka 4.0 发布:KRaft 替代 Zookeeper、新一代重平衡协议、点对点消息模型、移除旧协议 API

KRaft 全面替代 ZooKeeper Apache Kafka 4.0 是一个重要的里程碑&#xff0c;标志着第一个完全无需 Apache ZooKeeper 运行的主要版本。 通过默认运行在 KRaft 模式下&#xff0c;Kafka 简化了部署和管理&#xff0c;消除了维护单独 ZooKeeper 集群的复杂性。 这一变化显著降…

SFT实验报告

大模型微调实验报告* 实验目标 梳理大模型微调方法&#xff0c;评估各种基座和微调方法的实验效果。 基础模型 \1.Llama \2.Qwen \3.Chatglm4 \4. 微调策略 LoRA系列 低秩适配&#xff08;LoRA&#xff09;的核心思想是冻结原始参数&#xff0c;通过低秩分解引入可训…

LLM - R1 强化学习 DRPO 策略优化 DAPO 与 Dr. GRPO 算法 教程

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/146533892 在强化学习算法中&#xff0c;DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization)&#xff0c;通过解耦裁剪和动态采样策…

Mybatis_plus

前言 Mybatis_plus 是在 mybatis 的基础上进行了增强&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。本文章只做简单的使用介绍&#xff0c;更加详细的内容大家可以参考官网。 下面是mybatis_plus 官网地址&#xff1a; mybatis_plu…

idea 没有 add framework support(添加框架支持)选项

在 IntelliJ IDEA 2023 中&#xff0c;若需通过设置手动添加 “添加框架支持” 菜单项&#xff0c;可按照以下步骤操作&#xff1a; 手动添加 “添加框架支持” 菜单项 打开设置 点击顶部菜单栏的 File&#xff08;文件&#xff09; -> Settings&#xff08;设置&#xff09…

再探带权并查集

典型例题 Acwing 权值 故名思义&#xff0c;在带权并查集中&#xff0c;我们需要让每个节点携带一个**“权值”**。 那么这个权值应该是什么呢&#xff1f;其实答案就在并查集当中。 由于在并查集当中我们可以在 O ( 1 ) O(1) O(1) 时间内找到一个节点的根节点&#xff0c;那…

本地部署Stable Diffusion生成爆火的AI图片

直接上代码 Mapping("/send") Post public Object send(Body String promptBody) { JSONObject postSend new JSONObject(); System.out.println(promptBody); JSONObject body JSONObject.parseObject(promptBody); List<S…

边缘计算 vs. 云计算,谁才是工业物联网的未来?

前言 在物联网&#xff08;IoT&#xff09;飞速发展的今天&#xff0c;边缘计算正在彻底改变数据的处理、存储和分析方式。传统的IoT设备数据通常需要发送到云端进行处理&#xff0c;但随着设备数量的激增&#xff0c;这种模式在延迟、带宽和安全性方面暴露出诸多局限。边缘计…

dell 台式机 电脑 纽扣电池 如何取下?

dell 台式机 电脑 纽扣电池 如何取下&#xff1f; 戴尔-optiplex-3060-塔式机-服务手册

NFC 智能门锁全栈解决方案:移动端、服务器、Web 管理平台

目录 一、系统整体架构 二、移动端 APP 开发 2.1 开发环境与基础准备 2.2 主要功能模块 2.3 示例代码&#xff08;Android/Kotlin 简化示例&#xff09; 三、后台服务开发 3.1 环境准备 3.2 主要功能 3.3 示例代码&#xff08;Node.js Express 简化示例&#xff09; …

【AI】MAC版本本地Stable Diffusion web ui安装

文章目录 前言环境依赖homebrewpython3下载stable-diffusion-webui webui模型准备模型网站 中文页面设置提示词转汉语转英文controlnet安装controlnet模型下载 结尾 前言 目前&#xff0c;市面上已经出现了很多用Ai 绘图制作的作品&#xff0c;用于自媒体或者商业等。例如表情…

Linux 云服务器开放端口

首先找到你买服务器的官网&#xff0c;我这里是阿里云 点击这里的控制台 这里先点手动添加&#xff0c;再看自己是UDP还是TCP协议&#xff0c;找到对应的协议&#xff0c;目的就填你想开放的端口&#xff0c;源填所有IP/4 0.0.0.0 添加备注点击保存就开放好了。

[unity 点击事件] 区域响应点击事件,排除子节点区域,Raycast Target 应用

当我打开一个二级弹窗后&#xff0c;希望可以通过点击弹窗以外的区域来关闭该弹窗。一开始我是在弹窗主节点上挂载了一个 button 组件&#xff0c;该 button 注册的点击事件中关闭该弹窗。在子节点&#xff08;一个背景图&#xff09;的image组件上启用 Raycast Target 选项&am…