面向多年 iOS 开发者的零阻力上手


写在前面

你在 iOS 项目中也许习惯了 URLSessionAlamofireMoya
换到 Flutter 后,等价的「组合拳」就是 Dio + Retrofit
本文将带你一次吃透两套库的安装、核心 API、进阶技巧与最佳实践。


1. Dio:Flutter 里的「Alamofire」

特性作用iOS 类比
BaseOptions全局配置(超时、基址等)URLSessionConfiguration
Interceptors请求/响应拦截、重试、日志URLProtocol / RequestAdapter
CancelToken任务取消URLSessionTask.cancel()
FormData表单/文件上传multipart/form-data
download()断点续传downloadTask(withResumeData:)

1.1 安装

dependencies:dio: ^5.4.0   # 以实际最新版为准
flutter pub get

1.2 基础用法

final dio = Dio(BaseOptions(baseUrl: 'https://api.example.com',connectTimeout: const Duration(seconds: 10),receiveTimeout: const Duration(seconds: 15),headers: {'Accept': 'application/json'},),
);// GET
final res = await dio.get('/users/42');
print(res.data);// POST
await dio.post('/login',data: {'email': 'me@example.com', 'pwd': '123456'},
);

提示:默认 JSON ⇆ Map<String,dynamic>,无需手写解析。

1.3 拦截器 (Interceptors)

dio.interceptors.add(InterceptorsWrapper(onRequest: (options, handler) {options.headers['Authorization'] = 'Bearer $token';return handler.next(options); // 继续},onError: (e, handler) async {if (e.response?.statusCode == 401) {// 刷新 token 后重试final newToken = await _refreshToken();final request = e.requestOptions;request.headers['Authorization'] = 'Bearer $newToken';return handler.resolve(await dio.fetch(request));}return handler.next(e); // 继续抛出},),
);

1.4 取消 & 进度

final cancel = CancelToken();dio.download(url,savePath,cancelToken: cancel,onReceiveProgress: (recv, total) =>debugPrint('Progress ${(recv / total * 100).toStringAsFixed(0)}%'),
);// …在需要时
cancel.cancel('用户离开页面,停止下载');

2. Retrofit:类型安全的 REST 接口生成器

与 Android 同名库思路一致:用注解声明接口 ➜ 自动车生成实现 ➜ 调用即得强类型数据

2.1 安装

dependencies:retrofit: ^4.1.0dio: ^5.4.0json_annotation: ^4.9.0dev_dependencies:build_runner: ^2.4.10retrofit_generator: ^8.1.0json_serializable: ^6.8.0

2.2 声明接口(user_service.dart

part 'user_service.g.dart'; // 生成文件(baseUrl: 'https://api.example.com')
abstract class UserService {factory UserService(Dio dio, {String baseUrl}) = _UserService;('/users/{id}')Future<User> getUser(() int id);('/login')Future<AuthToken> login(() LoginPayload body);('/search')Future<List<User>> search(('keyword') String q,('X-Trace-Id') String traceId,);
}

2.3 生成代码

flutter pub run build_runner build -d

自动产出的 _UserService 文件包含所有实际的 Dio 调用与 JSON → 模型的序列化逻辑;你只和 接口 打交道。

2.4 调用

final dio = Dio()..interceptors.add(LogInterceptor());
final api = UserService(dio);final user = await api.getUser(42);
debugPrint(user.name);final token = await api.login(LoginPayload('me@example.com', '123456'));
await secureStorage.write(key: 'token', value: token.value);

3. Dio × Retrofit:组合最佳实践

  1. 复用同一 Dio 实例
    统一拦截器/超时/证书校验,防止重复配置。

  2. 自动刷新 Token
    在 Dio 拦截器里检测 401,完成刷新后 handler.resolve(...) 重放失败请求。

  3. 环境切换
    通过注入 baseUrlUserService(dio, baseUrl: kDebug ? dev : prod))即可。

  4. 响应泛型包装
    自定义 BaseResponse<T>,配合 json_serializable 解析:

    class BaseResponse<T> {final int code;final String msg;final T data;// …fromJson / toJson 省略
    }
    

4. 与 iOS 思维对照

概念Flutter (Dio / Retrofit)iOS 对应迁移 Tips
全局配置BaseOptionsURLSessionConfiguration把常用 Header、超时集中写
拦截器链InterceptorsWrapperURLProtocol / RequestInterceptor顺序执行,可短路
类型安全接口@GET, @POST 注解Moya TargetType / Swift ProtocolDart 代码生成替代手写
取消任务CancelTokenURLSessionTask页面销毁就 cancel
Mock 数据MockAdapterOHHTTPStubs / Mocker轻松写单元测试

5. 常见坑 & 进阶技巧

  1. HttpClientAdapter 自定义证书校验

    dio.httpClientAdapter = IOHttpClientAdapter()..onHttpClientCreate = (client) {client.badCertificateCallback = (_, __, ___) => true; // 仅示例return client;};
    
  2. 并发请求:使用 Future.wait([...])Isolate,避免阻塞 UI。

  3. 队列重试:配合 retry 包或自定义拦截器实现指数退避。

  4. 缓存dio_cache_interceptor 支持磁盘和内存双缓存策略。

  5. WebSocket:Dio 不负责,使用 web_socket_channel


6. 结语

Dio + Retrofit 为 Flutter 带来了与 iOS 熟悉的 网络层“三件套”

  1. 强大且可插拔的 HTTP 客户端
  2. 类型安全、零样板的接口定义
  3. 完善的拦截/重试/监控生态

只要把握「配置统一 → 模型生成 → 拦截链驱动」三步,就能迅速复制在 iOS 积累的工程经验,构建健壮、可测试、易维护的 Flutter 网络栈。

下一步:尝试将现有 Swift 服务层迁移为 Dart 接口,体验全端一致的开发流畅感吧!


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

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

相关文章

工作室考核源码(带后端)

题目内容可更改 下载地址:https://mcwlkj.lanzoub.com/iUF3z300tgfe 如图所示

数字孪生技术为UI前端提供全面支持:实现产品的可视化配置与定制

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 一、引言&#xff1a;数字孪生驱动产品定制的技术革命 在消费升级与工业 4.0 的双重驱动下&a…

通往物理世界自主智能的二元实在论与罗塞塔协议

序章&#xff1a;AI的“两种文化”之争——我们是否在构建错误的“神”&#xff1f; 自诞生以来&#xff0c;人工智能领域始终存在着一场隐秘的“两种文化”之争。一方是符号主义与逻辑的信徒&#xff0c;他们追求可解释、严谨的推理&#xff0c;相信智能的核心在于对世界规则…

探索 AI 系统提示与模型资源库:`system-prompts-and-models-of-ai-tools`

在当今的人工智能领域,系统提示和工具模型的优化与应用对于提升 AI 助手的性能和响应质量至关重要。x1xhlol 开源的 system-prompts-and-models-of-ai-tools 仓库为开发者们提供了一个丰富的资源集合,涵盖了多种 AI 工具的系统提示、工具和模型。 仓库概述 这个仓库包含了超…

城市灯光夜景人像街拍摄影后期Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 “城市灯光夜景人像街拍摄影后期 Lr 调色”&#xff0c;主要是利用 Lightroom 软件&#xff0c;对城市夜景中灯光下的人像街拍照片进行处理。通过调整色彩平衡、明暗对比和细节质感&#xff0c;强化夜景灯光的绚丽感&#xff0c;突出人像主体&#xff0c;同时协调人物…

JavaScript中的call、apply、bind:用法、实现与区别详解(面试常见)

# JavaScript中的call、apply、bind&#xff1a;用法、实现与区别详解## 核心概念 这三个方法都用于改变函数执行时的this指向&#xff0c;是JavaScript中函数上下文操作的核心API。## 1. 基本用法对比### call方法 javascript function.call(thisArg, arg1, arg2, ...)特点&am…

使用vue开发浏览器chrome插件教程,及之间的消息通信

基本介绍 开发浏览器插件&#xff0c;首先需要先了解他的结构&#xff0c;浏览器扩展通常包括以下几个部分 ├── manifest.json ├── package.json ├── vite.config.js ├── src ├── background │ └── index.js ├── content │ └── content.js ├── …

论文笔记(八十八)MLCVNet: Multi-Level Context VoteNet for 3D Object Detection

MLCVNet: Multi-Level Context VoteNet for 3D Object Detection 文章概括摘要I. 引言2. 相关工作2.1. 基于点云的 3D 目标检测2.2. 上下文信息 3. 方法3.1. VoteNet3.2. PPC 模块3.3. OOC 模块3.4. GSC 模块 4. 结果与讨论4.1. 数据集4.2. 训练细节4.3. 与最先进方法的比较4.4…

Redis初识第四期----Hash的命令和应用场景

首先为了区分Redis的键值对存储的key-value&#xff0c;Hash中的键值对称为field-value。 命令 1.Hset Hset key field value [field value] 返回值为设置成功的field-value的个数。 2.Hget Hget key field 返回为value 3.Hexists Hexists key field 判断是否存在&a…

【大数据技术栈】数据管理范畴常用大数据技术栈

一、技术栈分层架构 大数据技术栈通常分为四个核心层级&#xff1a; 数据采集层 负责多源异构数据的实时/批量采集 日志采集&#xff1a; F l u m e Flume Flume、 L o g s t a s h Logstash Logstash消息队列&#xff1a; K a f k a Kafka Kafka、 R a b b i t M Q RabbitMQ …

安全左移(Shift Left Security):软件安全的演进之路

文章目录 一、背景&#xff1a;传统安全的尴尬处境二、安全左移&#xff1a;让安全成为开发的“第一等公民”三、安全左移的关键实施阶段1. 需求阶段&#xff1a;嵌入安全需求建模2. 设计阶段&#xff1a;威胁建模与架构审计3. 编码阶段&#xff1a;安全编码规范与静态分析4. 构…

固定债可以卖call吗

我们都知道如果持有tlt&#xff0c;可以卖call来赚取时间价值&#xff0c;如果我买固定到期的美债而不是etf&#xff0c;有类似的操作吗&#xff0c;我可以卖call吗 以下是关于直接持有固定到期美债并尝试卖出看涨期权的详细分析&#xff1a; 一、直接持有美债与ETF&#xff08…

fish安装node.js环境

为什么强调fish shell&#xff0c;因为fish shell的缘故&#xff0c;不能直接执行node.js官网的命令 好的&#xff0c;您遇到了一个非常典型且重要的问题。请仔细阅读我的分析&#xff0c;这能帮您彻底解决问题。 问题诊断 您看到的所有错误&#xff0c;归根结底有两个核心原…

记一次Ubuntu22安装MongoDB8并同步本地数据过程

1. 效果展示 2. 安装MongoDB 8 根据官方文档https://www.mongodb.com/zh-cn/docs/manual/tutorial/install-mongodb-on-ubuntu/一顿操作即可 2.1 配置微调支持远程访问 修改配置文件,默认/etc/mongod.conf # network interfaces net:port: 27017bindIp: 0.0.0.02.2 新增adm…

HarmonyOS应用开发高级认证知识点梳理 (三)状态管理V2装饰器核心规则

以下是针对HarmonyOS应用开发高级认证备考的‌状态管理V2装饰器核心规则‌知识点系统梳理&#xff1a; 一、核心装饰器分类与功能 1. ‌组件声明装饰器‌ ComponentV2‌ (1)基础定义与限制 功能定位‌ 用于装饰自定义组件&#xff0c;启用V2状态管理能力&#xff0c;需配…

SAP资产记账相关业务成本中心为空的问题

用户在资产记账时&#xff0c;发现字段“成本中心”是空且为灰色的&#xff0c;并没有显示资产对应的成本中心&#xff0c;如下图所示&#xff1a; 首先&#xff0c;关于资产购置记账的相关业务&#xff0c;成本中心要不要显示&#xff1f;其实是可以不显示的&#xff0c;它是来…

智源大会AI安全论坛:深挖风险红线,探讨应对措施

6月7日&#xff0c;在与安远AI联合主办的智源大会“AI安全论坛”上&#xff0c;来自MIT、清华、复旦、人大、智源、多伦多大学、新加坡管理大学、Redwood Research、瑞莱智慧和安远AI 的学者与技术专家同台&#xff0c;以“AI安全”为核心议题&#xff0c;从主旨报告&#xff0…

电机控制的一些笔记

1. 电角度和机械角度 电角度 机械角度 * 磁极对数 机械角度就是实际的空间几何角度&#xff0c;范围是0-360 https://blog.csdn.net/leekay123/article/details/108655482 https://www.bilibili.com/video/BV11Q4y1Y7kR/?spm_id_from333.788.recommend_more_video.1&vd…

c#手动编译

一、配置环境变量 点击环境变量&#xff0c;在用户变量的path进行新建&#xff0c;点击编辑 点击新建 点击新建 添加文件目录 这是我的可能不一样&#xff0c;C:\Windows\Microsoft.NET\Framework64\v4.0.30319 输入 点击确定&#xff0c;就可以了 二、建立cs文件 代码实例…

pcap流量包分析工具设计

在复杂的网络世界中&#xff0c;数据包是信息的载体&#xff0c;但也可能成为风险的源头。无论是开发者调试接口&#xff0c;还是安全人员排查异常&#xff0c;都需要一个能够看透数据本质的“眼睛”。然而&#xff0c;专业的网络分析工具往往过于复杂&#xff0c;不适合快速定…