Flutter網絡請求封裝:高效、靈活、易用的Dio工具類

在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.pswp.cn/news/899171.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899171.shtml
英文地址,請注明出處:http://en.pswp.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;高級消…

Kotlin泛型: 協變|逆變|不變

引言 無論java 通配符上限還是下限&#xff0c;都多少存在缺陷&#xff0c;要么存不安全&#xff0c;要么取不安全。而kotlin就解決這個問題。讓out 純輸出&#xff0c; 讓in純輸入。 java這塊知識&#xff1a; java泛型的協變、逆變和不變-CSDN博客 協變 生產者out T 協變…

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

目錄 ? 方法一&#xff1a;使用 Excel 公式提取 body 部分 &#x1f50d; 解釋&#xff1a; ? 方法二&#xff1a;批量處理整列數據 &#x1f6a8; 注意事項 &#x1f6a8; 處理效果 我想保留Excel某一列的固定內容&#xff0c;比如原內容是&#xff1a; thread entry i…

C# System.Text.Encoding 使用詳解

總目錄 前言 在C#編程中&#xff0c;處理字符串和字節數組之間的轉換是一個常見的任務。System.Text.Encoding類及其派生類提供了豐富的功能&#xff0c;幫助開發者實現不同字符編碼之間的轉換。本文將詳細講解System.Text.Encoding類的使用方法&#xff0c;包括常用編碼的介紹…

Pre-flash和Main flash

在相機拍照過程中&#xff0c;Pre-flash&#xff08;預閃光&#xff09; 和 Main flash&#xff08;主閃光&#xff09; 是常見的兩種閃光燈使用模式&#xff0c;通常用于提高低光環境下的拍攝質量&#xff0c;尤其在自動曝光&#xff08;AE&#xff09;和自動對焦&#xff08;…

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;通過解耦裁剪和動態采樣策…

美攝科技智能汽車視頻延遲攝影解決方案,開啟智能出行新視界

在智能汽車時代&#xff0c;車載影像技術正以前所未有的速度發展&#xff0c;成為提升駕乘體驗和滿足用戶多樣化需求的關鍵因素。美攝科技憑借其卓越的技術實力和創新精神&#xff0c;推出了智能汽車視頻延遲攝影解決方案&#xff0c;為智能汽車行業帶來了一場視覺盛宴。 一、…

[250325] Claude AI 現已支持網絡搜索功能!| ReactOS 0.4.15 發布!

目錄 Claude AI 現已支持網絡搜索功能&#xff01;ReactOS 0.4.15 發布&#xff01; Claude AI 現已支持網絡搜索功能&#xff01; 近日&#xff0c;Anthropic 公司宣布&#xff0c;其 AI 助手 Claude 現在可以進行網絡搜索&#xff0c;為用戶提供更及時、更相關的回復。這項新…

代碼規范之Variable Names變量名

代碼規范之Variable Names變量名 golang中 官方文檔&#xff1a;https://go.dev/wiki/CodeReviewComments#variable-names Variable names in Go should be short rather than long. This is especially true for local variables with limited scope. Prefer c to lineCoun…

Mybatis_plus

前言 Mybatis_plus 是在 mybatis 的基礎上進行了增強&#xff0c;在 MyBatis 的基礎上只做增強不做改變&#xff0c;為簡化開發、提高效率而生。本文章只做簡單的使用介紹&#xff0c;更加詳細的內容大家可以參考官網。 下面是mybatis_plus 官網地址&#xff1a; mybatis_plu…

深圳問頂安全科技有限公司asktopsec是做什么的?

深圳問頂安全科技有限公司&#xff0c;是一家專業的AI與應用安全公司。 全球領先的AI、Android、IOS應用安全解決方案提供商&#xff0c;官網&#xff1a;https://asktopsec.com 問頂安全主要為企業提供AI和應用安全服務 移動應用安全檢測、移動應用安全加固、AI智能體安全、AI…

鴻蒙OS 5 架構設計探秘:從分層設計到多端部署

文章目錄 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署一、鴻蒙的分層架構設計二、模塊化設計的精髓三、智慧分發設計&#xff1a;資源的動態調度四、一次開發&#xff0c;多端部署的實踐總結與思考 鴻蒙OS架構設計探秘&#xff1a;從分層設計到多端部署 最近兩年來&a…

idea 沒有 add framework support(添加框架支持)選項

在 IntelliJ IDEA 2023 中&#xff0c;若需通過設置手動添加 “添加框架支持” 菜單項&#xff0c;可按照以下步驟操作&#xff1a; 手動添加 “添加框架支持” 菜單項 打開設置 點擊頂部菜單欄的 File&#xff08;文件&#xff09; -> Settings&#xff08;設置&#xff09…