type
status
date
slug
summary
tags
category
icon
password
有一天,我遇到了一个问题:我的 API 层返回的数据不够漂亮。经过一些研究后没有找到什么有用的解决方案,所以我决定以某种方式“新建”一些东西来解决问题。
代码生成简化了生活,直到它变得太复杂以至于很难增加应用的复杂度。
<ins/>
前提条件:
- Dio:用于 HTTP 请求
- Retrofit:生成所有的请求
- Freezed:生成用于处理的数据模型
- Json Serializable:生成 JSON 解析逻辑
- GetIt:依赖注入
- Build Runner 和其他生成器
在
pubspec.yaml
中添加依赖项:后端返回分页响应
我的后端可以返回一个分页响应,包含所有分页数据和请求的数据模型,结构如下:
创建基础类
如你所见,
docs
数组可以是任何类型,因此我创建了一个 PaginatedResponse
类作为基础类。代码如下:为了使其更加灵活,我创建了实际的数据模型:
创建 API
对于这项任务,我决定使用 Dio + Retrofit,原因如下:
- 使用简单
- 支持代码生成
- 支持拦截器
- 许多缓存包
- 支持日志功能
- 最重要的是:可以使它极速
我也有一个身份验证部分,但为了这个例子,先专注于这个方法。
现在,我们需要在依赖注入中注册它:
泛型魔法
接下来是最重要的部分 —— 如何结合泛型、代码生成、JSON、Dio、Retrofit 和 Freezed?
JsonSerializable
有一个非常有用的字段 genericArgumentFactories
—— 它允许我们使用泛型类的 JSON 解析方法。为此,我们需要为其他类(如 Purchase)创建一个基本响应类型:
我们将数据类从
MyDocType
扩展:主要部分
在分页类中添加一个自定义的
fromJson
方法,并添加一个泛型类型。代码如下:你需要为每个泛型类型在
fromJson
中指定一个 switch
案例,如上所示。不要忘记在 Retrofit 配置文件中指定泛型返回类型:
确保正确处理异常并进行异常捕获。
<ins/>
总结
通过这种方式,你可以:
- 灵活的数据请求模型
- 只需要一个命令来生成数据、请求等
- 拥有所有这些库带来的好处