作者:李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134349100
目 录
- 1. 概述
- 2. JSON to Dart
- 3. quicktype
- 简介/链接
- 应用
- 基本配置:
- 其他配置中涉及的库
- freezed库
- Hive库
- 4. Quicktype CLI
- 5. Dartj
1. 概述
本文介绍 Dart/Flutter常用的一些代码生成工具。在 Dart/Flutter 项目中使用代码生成工具的主要目的是提高开发效率和降低错误风险。使用这些工具主要有以下考虑:
-
数据绑定和序列化: 在移动应用开发中,经常需要将数据从不同的格式(例如 JSON)映射到 Dart 对象,或者将 Dart 对象序列化为其他格式。代码生成工具可以根据数据结构自动生成与数据交互相关的代码,从而简化这个过程。
-
类型安全: 通过使用代码生成工具,可以生成具有良好类型安全性的 Dart 代码。这有助于减少由于类型错误引起的运行时异常,提前捕获潜在的问题,并在开发阶段就能发现错误。
-
减少手动编写代码的工作量: 通过自动生成模型类、序列化和反序列化代码,开发者可以减少手动编写重复且容易出错的代码的工作量。这样可以提高生产力,减轻开发者的负担。
-
保持一致性: 生成工具可以确保生成的代码在结构上保持一致。这对于多人团队协作、维护和修改代码非常重要,能够降低代码维护的难度。
-
与后端交互: 当移动应用需要与后端服务进行交互时,通常需要定义与后端通信的数据模型。生成工具可以帮助在前端和后端之间保持一致的数据模型,从而简化通信和减少潜在的不匹配问题。
-
框架和库的兼容性: 一些代码生成工具专门设计用于与特定的框架或库集成,例如与 Flutter 或某个网络请求库的兼容性。这有助于更好地利用这些框架和库提供的功能。
因此,使用代码生成工具可以提高代码质量、减少错误和提高开发效率。
然而也要指出,这并不意味着所有项目都需要使用这些工具,因为它们的适用性取决于项目的规模、需求和开发团队的偏好。在某些情况下,手动编写代码可能更合适。
2. JSON to Dart
JSON to Dart 允许你输入 JSON 数据,然后生成相应的 Dart 代码。界面直观,支持一些基本的配置。其官方站点如下(点击图片链接即可跳转):
https://javiercbk.github.io/json_to_dart/
- 选项 Use private fields 表示使用私有字段。
3. quicktype
简介/链接
Quicktype 应用提供了一种将JSON转换成漂亮、类型安全的代码的方式,支持多种编程语言。其官方站点如下(点击图片链接即可跳转):
https://quicktype.io/
该站点的要功能包括:
JSON 转代码: 通过 quicktype 的 web 应用程序,用户可以将示例 JSON 数据转换为各种编程语言中的类型定义和序列化代码。用户只需提供样本 JSON、URL、JSON 模式或 GraphQL 查询,quicktype 就能生成相应的代码。
生成模型和序列化器: quicktype 能够根据 JSON、模式和 GraphQL 生成模型和序列化器,以便在任何编程语言中快速、安全地处理数据。
多语言支持: quicktype 支持多种编程语言,包括但不限于 Golang、Kotlin、Java、Dart、C++、Ruby、Objective-C、JSON Schema、TypeScript、Elm、Python、PHP、Pike、Rust、Flow、C#、Swift、JavaScript、Haskell 和 GraphQL。
类型安全和自动补全: 生成的代码可用于轻松解析数据、确保类型安全,并实现自动补全功能,提高代码的可读性和可维护性。
API 数据处理: quicktype 提供了一种更好的处理 API 数据的方式。用户只需提供样本 API 响应,quicktype 就能生成易于使用的客户端库,减轻用户在查找或编写客户端库上的负担。此外,当 API 发生更改时,quicktype 可重新生成类型,使用户能够更轻松地更新受影响的应用代码。
安装和使用: 用户可以通过 npm 安装 quicktype,并使用命令行工具生成代码。示例命令包括生成 Golang 代码、从 Bitcoin API 生成 C# 代码、从天气 API 生成 TypeScript 代码等。
应用
点击页面上的 “现在生成”按钮进入生成页面:
打开页面有右侧有一个选项(Options)按钮,可以打开配置界面。这个配置界面提供了一系列选项,让用户在生成 Dart 代码时进行一些定制化的设置。
首先是基本配置:
先选择语言:
在这里你可以勾选:
- 空安全(Null Safety)
- 仅类型(Types only)
- 将所有编解码器放在Class中(Put encoder & decoder in Class)
- 设置所有属性都为required(Make all properties required)
- 设置所有属性都为final(Make all properties final)
- 生成CopyWith方法(Generate CopyWith method)
- 设置所有属性都为optional(Make all properties optional)
具体说明如下
**空安全(Null Safety): 勾选此选项表示生成的 Dart 代码将使用 Dart 的空安全特性,即变量默认不能为null,需要显式地声明为可为null。
**仅类型(Types only): 勾选此选项表示生成的代码中只包含类型定义,而不包含与 JSON 编解码相关的代码。这对于只需要类型信息而不需要实际编解码功能的情况很有用。
将所有编解码器放在 Class 中(Put encoder & decoder in Class): 勾选此选项表示生成的编解码器代码将放置在类中,而不是在顶级函数中。这样可以更好地封装相关的功能。
设置所有属性都为 required(Make all properties required): 勾选此选项表示生成的 Dart 类中的所有属性都将被声明为必需的,不能为null。
设置所有属性都为 final(Make all properties final): 勾选此选项表示生成的 Dart 类中的所有属性都将被声明为不可更改的,即为 final 属性。
生成 CopyWith 方法(Generate CopyWith method): 勾选此选项表示生成的 Dart 类中将包含 CopyWith 方法,该方法用于创建一个对象的副本,但可以选择性地更改一些属性。
设置所有属性都为 optional(Make all properties optional): 勾选此选项表示生成的 Dart 类中的所有属性都将被声明为可选的,可以为null。
基本配置完成以后,可以在 Other 选项卡进一步配置(其他配置):
在这里你可以设置:
- 在“part”指令中使用该名称(Use this name in
part
directive) - 使用Map() & toMap()中的方法名(Use method names fromMap() & toMap())
- 生成具有@freezed兼容性的类定义(Generate class definitions with @freezed compatibility)
- 为“Hive”类型适配器生成注释(Generate annotations for Hive type adapters)
- 为json_serializable生成注释(Generate annotations for json_serializable)
- 检测UUIDs(Detect UUIDs)
- 检测dates和 times(Detect dates & times)
- 检测enums(Detect enums)
- 检测maps(Detect maps)
- 不要把$ref当作JSON中的引用(Don’t treat $ref as a reference in JSON)
- 合并相似的类(Merge similar classes)
其它配置的具体说明如下:
这个配置界面提供了一系列选项,让用户在生成 Dart 代码时进行一些定制化的设置。下面是每个选项的解释:
基本配置:
-
在“part”指令中使用该名称(Use this name in
part
directive): 此选项允许你指定在生成的 Dart 代码中使用 “part” 指令时的名称。 -
使用 Map() & toMap() 中的方法名(Use method names fromMap() & toMap()): 此选项允许你指定从 Map 转换为对象和从对象转换为 Map 时使用的方法名称。
-
生成具有 @freezed 兼容性的类定义(Generate class definitions with @freezed compatibility): 勾选此选项表示生成的 Dart 类定义将与
@freezed
注解兼容,@freezed
是一个 Dart 库,用于更方便地定义不可变(immutable)类。 -
为“Hive”类型适配器生成注释(Generate annotations for Hive type adapters): Hive 是一个 Dart 中的轻量级本地数据库,此选项允许为 Hive 类型适配器生成必要的注释。
-
为 json_serializable 生成注释(Generate annotations for json_serializable): 勾选此选项表示生成的 Dart 代码中将包含用于 json_serializable 库的注释,该库用于方便地序列化和反序列化 Dart 对象。
-
检测 UUIDs(Detect UUIDs): 此选项允许 quicktype 在 JSON 数据中检测并处理 UUID 类型。
-
检测 dates 和 times(Detect dates & times): 允许 quicktype 在 JSON 数据中检测并处理日期和时间类型。
-
检测 enums(Detect enums): 允许 quicktype 在 JSON 数据中检测并处理枚举类型。
-
检测 maps(Detect maps): 允许 quicktype 在 JSON 数据中检测并处理 Map 类型。
-
不要把 $ref 当作 JSON 中的引用(Don’t treat $ref as a reference in JSON): 此选项指示 quicktype 不将 JSON 中的 $ref 视为引用。
-
合并相似的类(Merge similar classes): 允许 quicktype 在生成的 Dart 代码中合并相似的类,以减少冗余。
其他配置中涉及的库
freezed库
说明:
freezed 是一个 Dart 语言的库,它简化了不可变(immutable)类的创建。通过 @freezed
注解,它可以为类自动生成 ==
、hashCode
等方法,使得定义和比较不可变对象更加方便。在 quicktype 中,选择 “生成具有 @freezed 兼容性的类定义” 选项将确保生成的 Dart 代码与 freezed
注解协同工作。
链接: freezed - Dart Package
使用示例:
import 'package:freezed_annotation/freezed_annotation.dart';
part 'example.freezed.dart';
class Example with _$Example {
const factory Example({String? name, int? age}) = _Example;
}
Hive库
说明:
Hive 是 Dart 语言中的一个轻量级、高性能的本地数据库。它支持嵌套、自定义对象以及复杂的数据结构,并且具有快速的读写操作。在 quicktype 中,选择 “为 Hive 类型适配器生成注释” 选项将为生成的 Dart 代码添加必要的注释,以支持 Hive 数据库的适配器生成。
链接: Hive - Dart Package
使用示例:
import 'package:hive/hive.dart';
part 'example.g.dart';
(typeId: 1)
class Example {
(0)
String? name;
(1)
int? age;
}
在这个示例中,HiveType
和 HiveField
注解用于指定 Hive 数据库中的类型和字段。选择 “为 Hive 类型适配器生成注释” 选项时,quicktype 将为这些注解生成额外的注释,以确保 Hive 数据库适配器的正确生成。
4. Quicktype CLI
Quicktype CLI 是一个命令行工具,实际上第3小节介绍的在线应用,就相当于 Quicktype CLI 的在线版本。你可以在 Git HUb上获取该命令行工具,地址为:https://github.com/glideapps/quicktype
地址:https://github.com/glideapps/quicktype
gitee 加速访问:https://gitee.com/jacklee1995/quicktype
5. Dartj
Dartj是一个专业的 Dart 代码生成工具,其功能与之前介绍的工具是类似的。其官方站点如下(点击图片链接即可跳转)。这个站点是基于 Flutter 开发的,而非传统基于 HTML 的页面:
https://dartj.web.app/
左侧是其配置选项卡,包括:
-
类名输入框:
-
类内容选项:
-
Classic: 使用传统的 Dart 代码生成模式,生成的代码包含类似于手动编写的 Dart 类的结构。
-
Json Serializable: 这个选项用于生成与 JSON 互操作的 Dart 代码。使用类似于json_serializable 这样的库,以简化 Dart 类的 JSON 序列化和反序列化。
-
Freezed: freezed ,它提供了一种声明式的方式来创建不可变(immutable)类,并自动生成与之相关的代码。
-
Vexana: 这个选项与 Dart 中的网络请求库 Vexana 相关的。它用于生成与 Vexana 一起使用的 Dart 类,以便更轻松地处理网络请求和响应。
- 多选选项(用于进一步配置):