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,原因如下:
  1. 使用简单
  1. 支持代码生成
  1. 支持拦截器
  1. 许多缓存包
  1. 支持日志功能
  1. 最重要的是:可以使它极速
我也有一个身份验证部分,但为了这个例子,先专注于这个方法。
现在,我们需要在依赖注入中注册它:

泛型魔法

接下来是最重要的部分 —— 如何结合泛型、代码生成、JSON、Dio、Retrofit 和 Freezed?
JsonSerializable 有一个非常有用的字段 genericArgumentFactories —— 它允许我们使用泛型类的 JSON 解析方法。
为此,我们需要为其他类(如 Purchase)创建一个基本响应类型:
我们将数据类从 MyDocType 扩展:

主要部分

在分页类中添加一个自定义的 fromJson 方法,并添加一个泛型类型。代码如下:
你需要为每个泛型类型在 fromJson 中指定一个 switch 案例,如上所示。
不要忘记在 Retrofit 配置文件中指定泛型返回类型:
确保正确处理异常并进行异常捕获。
 
<ins/>

总结

通过这种方式,你可以:
  1. 灵活的数据请求模型
  1. 只需要一个命令来生成数据、请求等
  1. 拥有所有这些库带来的好处