Flutter 网络请求与数据处理:从基础到单例封装

devtools/2025/2/22 1:40:19/

Flutter 网络请求与数据处理:从基础到单例封装

在 Flutter 开发中,网络请求是一个非常常见的需求,比如获取 API 数据、上传文件、处理分页加载等。为了高效地处理网络请求和数据管理,我们需要选择合适的工具并进行合理的封装。

本篇博客将详细介绍 Flutter 中网络请求的基础知识、常用库(如 httpdio),并最终实现一个单例模式的网络请求封装,帮助你在项目中高效管理网络请求


1. 网络请求的基础知识

1.1 HTTP 请求的基本类型

  1. GET:从服务器获取数据。
  2. POST:向服务器发送数据。
  3. PUT:更新服务器上的数据。
  4. DELETE:删除服务器上的数据。

1.2 常用的网络请求

  1. http
    • Flutter 官方提供的轻量级 HTTP 客户端。
    • 适合简单的网络请求
  2. 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 httpdio 的对比

特性httpdio
功能轻量级,适合简单请求功能强大,支持拦截器、文件上传等
学习曲线
扩展性较低
适用场景小型项目中型和大型项目

5.2 实践建议

  1. 小型项目
    • 使用 http,简单易用。
  2. 中型和大型项目
    • 使用 dio,并通过单例模式封装,统一管理网络请求

http://www.ppmy.cn/devtools/160834.html

相关文章

2025三掌柜赠书活动第五期:Elasticsearch实战(第2版)

目录 前言 Elasticsearch实际应用 关于《Elasticsearch实战&#xff08;第2版&#xff09;》 编辑推荐 内容简介 作者简介 图书目录 媒体评论 《Elasticsearch实战&#xff08;第2版&#xff09;》全书速览 结束语 前言 在当今数据爆炸的时代&#xff0c;企业面临着从…

基于单片机的智能网控风扇设计

摘要:通过对该项目的研究可以实现对电风扇的智能控制,解决夏季炎热环境下,气温变化不定而档位单一固定的问题,摆脱了必须手动调节挡位的束缚,同时也有效抑制了电扇无人空转对电能的浪费。伴随互联网的迅猛发展,为风扇加装网络模块可实现手机app智能操控和对原有设置的个性…

网络安全行业有哪些公司

只是简单做一下网络安全公司梳理&#xff0c;不作点评&#xff0c;下列排名不分先后。 一、常见的网络安全公司 1、天融信 天融信&#xff08;002212.SZ&#xff09;创始于1995年&#xff0c;是上市公司中成立最早的网络安全企业&#xff0c;亲历中国网络安全产业的发展历程…

自适应SQL计划管理(Adaptive SQL Plan Management)在Oracle 12c中的应用

在Oracle Database 12c Release 1 (12.1)版本中&#xff0c;引入了对SQL计划管理&#xff08;SPM&#xff09;功能的增强&#xff0c;特别是关于SQL计划基线的自动进化机制。这一改进允许数据库更加智能地管理和优化SQL查询的执行计划&#xff0c;确保即使数据分布发生变化&…

PHP图书借阅小程序源码

&#x1f4da; 图书借阅小程序&#xff1a;一键开启智慧阅读新篇章 &#x1f31f; 这是一款由ThinkPHP与UniApp两大技术巨擘强强联手精心打造的图书借阅微信小程序&#xff0c;它犹如一座随身携带的移动图书馆&#xff0c;让您无论身处何地都能轻松畅游知识的海洋。创新的多书…

如何启动 Linux Debian/Ubuntu 等 SSH 服务器

文章目录 引言正文一、什么是 SSH&#xff1f;二、安装 SSH 服务器三、验证 SSH 服务是否运行四、配置 SSH 服务器五、使用 SSH 客户端连接到服务器六、安全优化七、常见问题及解决方法 总结 引言 SSH&#xff08;Secure Shell&#xff09;是一种用于远程登录和执行命令的安全…

File Browser配置SSH,使用HTTPS安全访问

配置好后就可以直接使用域名安全访问了 首先你先安装好File Browser 一条命令即可简单搞定&#xff0c;正常启动直接输入这样的命令就行了&#xff1a; filebrowser -a 0.0.0.0 -d /opt/filebrowser/filebrowser.db 我们首先把域名证书传输到服务器&#xff0c;最好是同一个…

【大学生职业规划大赛备赛PPT资料PDF | 免费共享】

自取链接&#xff1a; 链接&#xff1a;https://pan.quark.cn/s/4fa45515325e &#x1f4e2; 同学&#xff0c;你是不是正在为职业规划大赛发愁&#xff1f; 想展示独特思路却不知如何下手&#xff1f; 想用专业模板却找不到资源&#xff1f; 别担心&#xff01;我整理了全网…