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

news2025/2/21 10:09:17

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.coloradmin.cn/o/2300912.html

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

相关文章

数控机床设备分布式健康监测与智能维护系统MTAgent

数控机床设备分布式健康监测与智能维护系统MTAgent-v1.1融合了目前各种先进的信号处理以及信息分析算法以算法工具箱的方式&#xff0c;采用了一种开发的、模块化的结构实现信号各种分析处理&#xff0c;采用Python编程语言&#xff0c;满足不同平台需求(包括Windows、Linux)。…

Java+SpringBoot+数据可视化的家庭记账小程序(程序+论文+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当下这个科技日新月异、经济蓬勃向上的时代&#xff0c;中国经济正以令人瞩目的速度迅…

前端JS接口加密攻防实操

前端JS接口加密攻防实操 背景 在爬虫过程中&#xff0c;对数据接口各类加密的经历总结&#xff0c;无头消耗资源效率不高&#xff0c;采用浏览器兜底解密协程并行 青铜版(混淆对称加密|签名nonce等&#xff09; 解&#xff1a;根据API 调用栈&#xff0c;断点找到request参…

百度搜索融合 DeepSeek 满血版,开启智能搜索新篇

百度搜索融合 DeepSeek 满血版&#xff0c;开启智能搜索新篇 &#x1f680; &#x1f539; 一、百度搜索全量接入 DeepSeek &#x1f539; 百度搜索迎来重要升级&#xff0c;DeepSeek 满血版全面上线&#xff01;&#x1f389; 用户在百度 APP 搜索后&#xff0c;点击「AI」即…

游戏引擎学习第103天

仓库:https://gitee.com/mrxiao_com/2d_game_2 回顾bug 接下来回顾一下这个bug的具体情况。当前是一个调试视图&#xff0c;我们并不是直接在调试视图下工作&#xff0c;而是在进行相关的调试。展示了地图&#xff0c;这里是环境贴图&#xff0c;上面是正在使用的环境贴图&am…

WPF快速创建DeepSeek本地自己的客户端-基础思路版本

开发工具&#xff1a;VS 2015 开发环境&#xff1a;.Net 4.0 使用技术&#xff1a;WPF 本篇文章内容&#xff1a; 本地部署DeepSeek以后一般使用网页工具&#xff08;如Chatbox&#xff09;或者DOS窗口与其对话。本篇文章使用WPF创建一个基础版的对话工具。 一、搭建本地DeepS…

spring cloud gateway限流常见算法

目录 一、网关限流 1、限流的作用 1. 保护后端服务 2. 保证服务质量 (QoS) 3. 避免滥用和恶意攻击 4. 减少资源浪费 5. 提高系统可扩展性和稳定性 6. 控制不同用户的访问频率 7. 提升用户体验 8. 避免API滥用和负载过高 9. 监控与分析 10. 避免系统崩溃 2、网关限…

网络安全的态势如何以及如何解决?

大家好,我是AI拉呱,一个专注于人工智领域与网络安全方面的博主,现任资深算法研究员一职,兼职硕士研究生导师;热爱机器学习和深度学习算法应用,深耕大语言模型微调、量化、私域部署。曾获多次获得AI竞赛大奖,拥有多项发明专利和学术论文。对于AI算法有自己独特见解和经验…

2026考研趋势深度解析:政策变化+高效工具指南

2026考研深度解析&#xff1a;趋势洞察高效工具指南&#xff0c;助你科学备战上岸 从政策变化到工具实战&#xff0c;这份千字攻略解决99%考生的核心焦虑 【热点引入&#xff1a;考研赛道进入“高难度模式”】 2025年全国硕士研究生报名人数突破520万&#xff0c;报录比预计扩…

AI工具篇:利用DeepSeek+Kimi 辅助生成综述汇报PPT

随着科研和学术报告需求的增加&#xff0c;如何高效地准备一份结构清晰、内容充实的PPT已成为许多研究者的挑战。 传统的PPT制作过程繁琐&#xff0c;需要大量文献收集、数据分析和设计工作&#xff0c;而AI工具能够帮助提升效率&#xff0c;减少重复劳动。 本文将介绍如何使用…

【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 指令一…

Wireshark 输出 数据包列表本身的值

在 Wireshark 中&#xff0c;如果你想输出数据包列表本身的值&#xff08;例如&#xff0c;将数据包的摘要信息、时间戳、源地址、目的地址等导出为文本格式&#xff09;&#xff0c;可以使用 导出为纯文本文件 的功能。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Wir…

docker部署单机版doris,完整无坑

文章目录 一、部署1、修改内核参数2、下载Docker 开发环境镜像3、下载安装包4、启动镜像5、配置fe6、配置be7、远程连接 二、运维命令参考资料 一、部署 1、修改内核参数 在启动doris的be时&#xff0c;需要将 Linux 操作系统的内核参数设置为2000000&#xff0c;这里是Doris…

STM32 低功耗模式

目录 背景 低功耗模式 睡眠模式 进入睡眠模式 退出睡眠模式 停止模式 进入停止模式 退出停止模式 待机模式 进入待机模式 退出待机模式 程序 睡眠模式 休眠模式配置 进入休眠模式 退出睡眠模式 停止模式 停止模式配置 进入停止模式 退出停止模式 待机模式…

网络安全架构战略 网络安全体系结构

本节书摘来自异步社区《网络安全体系结构》一书中的第1章&#xff0c;第1.4节&#xff0c;作者【美】Sean Convery 1.4 一切皆为目标 网络安全体系结构 当前的大型网络存在着惊人的相互依赖性&#xff0c;作为一名网络安全设计师&#xff0c;对这一点必须心知肚明。Internet就…

【算法】回溯算法

回溯算法 什么是回溯 人生无时不在选择。在选择的路口&#xff0c;你该如何抉择 ..... 回溯&#xff1a; 是一种选优搜索法&#xff0c;又称为试探法&#xff0c;按选优条件向前搜索&#xff0c;以达到目标。但当探索到某一步时&#xff0c;发现原先选择并不优或达不到目标&am…

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年《李宏毅机器学习课程》的笔记&#xff0c;感谢台湾大学李宏毅教授的课程&#xff0c;respect&#xff01;&#xff01;&#xff01; 二、大纲 引例RNN历史基本思想RNN变形RNN训练 三、引例 学习RNN之前先看一个例子&#xff1a; 假设要做一…

Linux 文件系统inode软硬链接

目录 一、理解文件系统 1、前言 2、磁盘 二、inode 1、创建一个新文件的 4 个操作 三、软硬链接 1、软链接 2、硬链接 3、硬链接的应用 4、软链接的应用 一、理解文件系统 1、前言 在我们电脑文件里&#xff0c;分为打开的文件和未打开的文件&#xff0c;我们在上…

多目标粒子群优化算法-MOPSO-(机器人路径规划/多目标信号处理(图像/音频))

具体完整算法请跳转&#xff1a;多目标粒子群优化算法-MOPSO-&#xff08;机器人路径规划/多目标信号处理&#xff08;图像/音频&#xff09;&#xff09; 多目标粒子群优化算法&#xff08;Multi-Objective Particle Swarm Optimization&#xff0c;MOPSO&#xff09;是一种基…