Flutter 网络请求与数据处理:从基础到单例封装
Flutter 网络请求与数据处理:从基础到单例封装
在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。
本篇博客将详细介绍 Flutter 中网络请求的基础知识、常用库(如 http 和 dio),并最终实现一个单例模式的网络请求封装,帮助你在项目中高效管理网络请求。
1. 网络请求的基础知识
1.1 HTTP 请求的基本类型
- GET:从服务器获取数据。
- POST:向服务器发送数据。
- PUT:更新服务器上的数据。
- DELETE:删除服务器上的数据。
1.2 常用的网络请求库
http:- Flutter 官方提供的轻量级 HTTP 客户端。
- 适合简单的网络请求。
dio:- 功能强大的第三方库,支持拦截器、文件上传下载、请求取消等。
- 适合复杂的网络请求场景。
2. 使用 http 进行网络请求
2.1 安装 http
在 pubspec.yaml 中添加依赖:
dependencies:http: ^0.15.0
运行以下命令安装依赖:
flutter pub get
2.2 基本用法
GET 请求
import 'dart:convert';
import 'package:http/http.dart' as http;void fetchData() async {final url = Uri.parse("https://jsonplaceholder.typicode.com/posts");final response = await http.get(url);if (response.statusCode == 200) {final data = json.decode(response.body);print("数据加载成功:$data");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {fetchData();
}
POST 请求
void postData() async {final url = Uri.parse("https://jsonplaceholder.typicode.com/posts");final response = await http.post(url,headers: {"Content-Type": "application/json"},body: json.encode({"title": "Flutter", "body": "Hello World", "userId": 1}),);if (response.statusCode == 201) {final data = json.decode(response.body);print("数据提交成功:$data");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {postData();
}
3. 使用 dio 进行网络请求
3.1 安装 dio
在 pubspec.yaml 中添加依赖:
dependencies:dio: ^5.0.0
运行以下命令安装依赖:
flutter pub get
3.2 基本用法
GET 请求
import 'package:dio/dio.dart';void fetchData() async {final dio = Dio();final response = await dio.get("https://jsonplaceholder.typicode.com/posts");if (response.statusCode == 200) {print("数据加载成功:${response.data}");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {fetchData();
}
POST 请求
void postData() async {final dio = Dio();final response = await dio.post("https://jsonplaceholder.typicode.com/posts",data: {"title": "Flutter", "body": "Hello World", "userId": 1},);if (response.statusCode == 201) {print("数据提交成功:${response.data}");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {postData();
}
3.3 使用拦截器
dio 提供了强大的拦截器功能,可以在请求前后进行统一处理。
示例:添加拦截器
void fetchDataWithInterceptor() async {final dio = Dio();// 添加拦截器dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {print("请求开始:${options.uri}");return handler.next(options);},onResponse: (response, handler) {print("请求成功:${response.data}");return handler.next(response);},onError: (error, handler) {print("请求失败:${error.message}");return handler.next(error);},));final response = await dio.get("https://jsonplaceholder.typicode.com/posts");print(response.data);
}void main() {fetchDataWithInterceptor();
}
4. 单例模式封装网络请求
在实际项目中,网络请求通常需要统一管理,比如设置基础 URL、添加拦截器、处理错误等。通过单例模式封装网络请求,可以提高代码的复用性和可维护性。
4.1 单例封装 dio
封装代码
import 'package:dio/dio.dart';class DioClient {// 单例模式static final DioClient _instance = DioClient._internal();factory DioClient() => _instance;late Dio _dio;DioClient._internal() {_dio = Dio(BaseOptions(baseUrl: "https://jsonplaceholder.typicode.com",connectTimeout: const Duration(seconds: 10),receiveTimeout: const Duration(seconds: 10),headers: {"Content-Type": "application/json"},));// 添加拦截器_dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {print("请求开始:${options.uri}");return handler.next(options);},onResponse: (response, handler) {print("请求成功:${response.data}");return handler.next(response);},onError: (error, handler) {print("请求失败:${error.message}");return handler.next(error);},));}// GET 请求Future<Response> get(String path, {Map<String, dynamic>? queryParameters}) async {return await _dio.get(path, queryParameters: queryParameters);}// POST 请求Future<Response> post(String path, {Map<String, dynamic>? data}) async {return await _dio.post(path, data: data);}// PUT 请求Future<Response> put(String path, {Map<String, dynamic>? data}) async {return await _dio.put(path, data: data);}// DELETE 请求Future<Response> delete(String path, {Map<String, dynamic>? data}) async {return await _dio.delete(path, data: data);}
}
4.2 使用封装的 DioClient
GET 请求
void fetchData() async {final dioClient = DioClient();final response = await dioClient.get("/posts");if (response.statusCode == 200) {print("数据加载成功:${response.data}");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {fetchData();
}
POST 请求
void postData() async {final dioClient = DioClient();final response = await dioClient.post("/posts",data: {"title": "Flutter", "body": "Hello World", "userId": 1},);if (response.statusCode == 201) {print("数据提交成功:${response.data}");} else {print("请求失败,状态码:${response.statusCode}");}
}void main() {postData();
}
5. 总结
5.1 http 和 dio 的对比
| 特性 | http | dio |
|---|---|---|
| 功能 | 轻量级,适合简单请求 | 功能强大,支持拦截器、文件上传等 |
| 学习曲线 | 低 | 中 |
| 扩展性 | 较低 | 高 |
| 适用场景 | 小型项目 | 中型和大型项目 |
5.2 实践建议
- 小型项目:
- 使用
http,简单易用。
- 使用
- 中型和大型项目:
- 使用
dio,并通过单例模式封装,统一管理网络请求。
- 使用
相关文章:
Flutter 网络请求与数据处理:从基础到单例封装
Flutter 网络请求与数据处理:从基础到单例封装 在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。 …...
数控机床设备分布式健康监测与智能维护系统MTAgent
数控机床设备分布式健康监测与智能维护系统MTAgent-v1.1融合了目前各种先进的信号处理以及信息分析算法以算法工具箱的方式,采用了一种开发的、模块化的结构实现信号各种分析处理,采用Python编程语言,满足不同平台需求(包括Windows、Linux)。…...
Java+SpringBoot+数据可视化的家庭记账小程序(程序+论文+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当下这个科技日新月异、经济蓬勃向上的时代,中国经济正以令人瞩目的速度迅…...
基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例
简简单单 Online zuozuo :本心、输入输出、结果 文章目录 基于 Ollama 工具的 LLM 大语言模型如何部署,以 DeepSeek 14B 本地部署为例前言下载 Ollama实际部署所需的硬件要求设置 LLM 使用 GPU ,发挥 100% GPU 性能Ollama 大模型管理命令大模型的实际运行资源消耗基于 Ollam…...
前端JS接口加密攻防实操
前端JS接口加密攻防实操 背景 在爬虫过程中,对数据接口各类加密的经历总结,无头消耗资源效率不高,采用浏览器兜底解密协程并行 青铜版(混淆对称加密|签名nonce等) 解:根据API 调用栈,断点找到request参…...
Python基础--计算机基础
1. 计算机基础 1.1 硬件组成 核心硬件: CPU:负责逻辑运算与指令执行(如Intel Core、AMD Ryzen)内存(RAM):临时存储运行中的程序与数据(如DDR4 16GB)硬盘(HDD…...
计算机考研之数据结构:深入解析最大公约数与欧几里得算法
一、生活中的公约数应用 在日常生活中,经常需要处理"均分分配"问题。例如:要将24块巧克力和18块饼干平均分给小朋友,最多能分给几个小朋友?这就是典型的求最大公约数问题。 二、基本概念详解 约数与公约数 约数&…...
百度搜索融合 DeepSeek 满血版,开启智能搜索新篇
百度搜索融合 DeepSeek 满血版,开启智能搜索新篇 🚀 🔹 一、百度搜索全量接入 DeepSeek 🔹 百度搜索迎来重要升级,DeepSeek 满血版全面上线!🎉 用户在百度 APP 搜索后,点击「AI」即…...
游戏引擎学习第103天
仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾bug 接下来回顾一下这个bug的具体情况。当前是一个调试视图,我们并不是直接在调试视图下工作,而是在进行相关的调试。展示了地图,这里是环境贴图,上面是正在使用的环境贴图&am…...
WPF快速创建DeepSeek本地自己的客户端-基础思路版本
开发工具:VS 2015 开发环境:.Net 4.0 使用技术:WPF 本篇文章内容: 本地部署DeepSeek以后一般使用网页工具(如Chatbox)或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…...
Springboot使用Redis发布订阅自动更新缓存数据源
背景 当项目有很多数据源的时候,通常会在启动的时候就把数据源连接加载缓存上,当数据源进行变更后如何自动实时将缓存的数据源进行更新呢?如果是单个项目直接调接口方法就行了,但是涉及到分布式多个系统呢? 解决方案…...
spring cloud gateway限流常见算法
目录 一、网关限流 1、限流的作用 1. 保护后端服务 2. 保证服务质量 (QoS) 3. 避免滥用和恶意攻击 4. 减少资源浪费 5. 提高系统可扩展性和稳定性 6. 控制不同用户的访问频率 7. 提升用户体验 8. 避免API滥用和负载过高 9. 监控与分析 10. 避免系统崩溃 2、网关限…...
网络安全的态势如何以及如何解决?
大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…...
vue3和vue2的组件开发有什么区别
Vue3和Vue2在组件开发上存在不少差异,下面从多个方面详细介绍: 响应式原理 Vue2:用Object.defineProperty()方法来实现响应式。打个比方,它就像给对象的每个属性都安排了一个“小管家”,属性被访问或修改时࿰…...
Pytorch实现之粒子群优化算法在GAN中的应用
简介 简介:主要是采用了粒子群优化(PSO)算法来优化GAN的一个训练。PSO是一种是一种基于种群的随机优化技术。这种优化技术是通过粒子群进行的,粒子群在每次迭代中都会更新自己。对于给定的目标函数,这种方法利用一个搜索空间,在那里粒子群移动,找到所需的全局最小值。这…...
2026考研趋势深度解析:政策变化+高效工具指南
2026考研深度解析:趋势洞察高效工具指南,助你科学备战上岸 从政策变化到工具实战,这份千字攻略解决99%考生的核心焦虑 【热点引入:考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万,报录比预计扩…...
AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT
随着科研和学术报告需求的增加,如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐,需要大量文献收集、数据分析和设计工作,而AI工具能够帮助提升效率,减少重复劳动。 本文将介绍如何使用…...
【Linux系统】—— 调试器 gdb/cgdb的使用
【Linux系统】—— 调试器 gdb/cgdb的使用 1 前置准备2 快速认识 gdb3 cgdb/gdb 的使用3.1 简单认识 cgdb3.2 打断点 / 删断点3.3 逐过程 / 逐语句3.4 查看变量3.5 快速跳转 4 cgdb/gdb 调试技巧4.1 watch4.2 「set var」确定问题原因4.3 条件断点 5 概念理解6 gdb/cgdb 指令一…...
Vue 3 中,Pinia 和 Vuex 的主要区别
总结对比表 对比项VuexPiniaAPI 设计区分 mutations/actions仅 state/actions/getters模块化嵌套式配置独立 Store,按需组合TypeScript需手动声明类型原生自动推断代码简洁性冗余(需 commit/dispatch)直接调用方法推荐场景Vue 2 升级项目/严…...
Wireshark 输出 数据包列表本身的值
在 Wireshark 中,如果你想输出数据包列表本身的值(例如,将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式),可以使用 导出为纯文本文件 的功能。以下是详细步骤: 步骤 1:打开 Wir…...
docker部署单机版doris,完整无坑
文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时,需要将 Linux 操作系统的内核参数设置为2000000,这里是Doris…...
SQL注入(SQL Injection)详解与实战
文章目录 一、什么是SQL注入?二、常见SQL注入类型三、手动注入步骤(以CTF题目为例)四、CTF实战技巧五、自动化工具:SQLMap六、防御措施七、CTF例题八、资源推荐 一、什么是SQL注入? SQL注入是一种通过用户输入构造恶意…...
STM32 低功耗模式
目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…...
网络安全架构战略 网络安全体系结构
本节书摘来自异步社区《网络安全体系结构》一书中的第1章,第1.4节,作者【美】Sean Convery 1.4 一切皆为目标 网络安全体系结构 当前的大型网络存在着惊人的相互依赖性,作为一名网络安全设计师,对这一点必须心知肚明。Internet就…...
【算法】回溯算法
回溯算法 什么是回溯 人生无时不在选择。在选择的路口,你该如何抉择 ..... 回溯: 是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标&am…...
AI大模型(如GPT、BERT等)可以通过自然语言处理(NLP)和机器学习技术,显著提升测试效率
在软件测试中,AI大模型(如GPT、BERT等)可以通过自然语言处理(NLP)和机器学习技术,显著提升测试效率。以下是几个具体的应用场景及对应的代码实现示例: 1. 自动生成测试用例 AI大模型可以根据需求文档或用户故事自动生成测试用例。 代码示例(使用 OpenAI GPT API): …...
Centos安装php-8.0.24.tar
查看系统环境 cat /etc/redhat-release 预先安装必要的依赖 yum install -y \ wget \ gcc \ gcc-c \ autoconf \ automake \ libtool \ make \ libxml2 \ libxml2-devel \ openssl \ openssl-devel \ sqlite-devel yum update 1、下载解压 cd /data/ wget https:/…...
机器学习(李宏毅)——RNN
一、前言 本文章作为学习2023年《李宏毅机器学习课程》的笔记,感谢台湾大学李宏毅教授的课程,respect!!! 二、大纲 引例RNN历史基本思想RNN变形RNN训练 三、引例 学习RNN之前先看一个例子: 假设要做一…...
Linux 文件系统inode软硬链接
目录 一、理解文件系统 1、前言 2、磁盘 二、inode 1、创建一个新文件的 4 个操作 三、软硬链接 1、软链接 2、硬链接 3、硬链接的应用 4、软链接的应用 一、理解文件系统 1、前言 在我们电脑文件里,分为打开的文件和未打开的文件,我们在上…...
多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频))
具体完整算法请跳转:多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频)) 多目标粒子群优化算法(Multi-Objective Particle Swarm Optimization,MOPSO)是一种基…...
