Dart笔记:一些代码生成工具站点的介绍

Dart笔记:
一些代码生成工具站点的介绍

作者李俊才 (jcLee95):https://blog.csdn.net/qq_28550263
邮箱 :291148484@163.com
本文地址:https://blog.csdn.net/qq_28550263/article/details/134349100



1. 概述

本文介绍 Dart/Flutter常用的一些代码生成工具。在 Dart/Flutter 项目中使用代码生成工具的主要目的是提高开发效率和降低错误风险。使用这些工具主要有以下考虑:

  1. 数据绑定和序列化: 在移动应用开发中,经常需要将数据从不同的格式(例如 JSON)映射到 Dart 对象,或者将 Dart 对象序列化为其他格式。代码生成工具可以根据数据结构自动生成与数据交互相关的代码,从而简化这个过程。

  2. 类型安全: 通过使用代码生成工具,可以生成具有良好类型安全性的 Dart 代码。这有助于减少由于类型错误引起的运行时异常,提前捕获潜在的问题,并在开发阶段就能发现错误。

  3. 减少手动编写代码的工作量: 通过自动生成模型类、序列化和反序列化代码,开发者可以减少手动编写重复且容易出错的代码的工作量。这样可以提高生产力,减轻开发者的负担。

  4. 保持一致性: 生成工具可以确保生成的代码在结构上保持一致。这对于多人团队协作、维护和修改代码非常重要,能够降低代码维护的难度。

  5. 与后端交互: 当移动应用需要与后端服务进行交互时,通常需要定义与后端通信的数据模型。生成工具可以帮助在前端和后端之间保持一致的数据模型,从而简化通信和减少潜在的不匹配问题。

  6. 框架和库的兼容性: 一些代码生成工具专门设计用于与特定的框架或库集成,例如与 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 代码时进行一些定制化的设置。下面是每个选项的解释:

基本配置:

  1. 在“part”指令中使用该名称(Use this name in part directive): 此选项允许你指定在生成的 Dart 代码中使用 “part” 指令时的名称。

  2. 使用 Map() & toMap() 中的方法名(Use method names fromMap() & toMap()): 此选项允许你指定从 Map 转换为对象和从对象转换为 Map 时使用的方法名称。

  3. 生成具有 @freezed 兼容性的类定义(Generate class definitions with @freezed compatibility): 勾选此选项表示生成的 Dart 类定义将与 @freezed 注解兼容,@freezed 是一个 Dart 库,用于更方便地定义不可变(immutable)类。

  4. 为“Hive”类型适配器生成注释(Generate annotations for Hive type adapters): Hive 是一个 Dart 中的轻量级本地数据库,此选项允许为 Hive 类型适配器生成必要的注释。

  5. 为 json_serializable 生成注释(Generate annotations for json_serializable): 勾选此选项表示生成的 Dart 代码中将包含用于 json_serializable 库的注释,该库用于方便地序列化和反序列化 Dart 对象。

  6. 检测 UUIDs(Detect UUIDs): 此选项允许 quicktype 在 JSON 数据中检测并处理 UUID 类型。

  7. 检测 dates 和 times(Detect dates & times): 允许 quicktype 在 JSON 数据中检测并处理日期和时间类型。

  8. 检测 enums(Detect enums): 允许 quicktype 在 JSON 数据中检测并处理枚举类型。

  9. 检测 maps(Detect maps): 允许 quicktype 在 JSON 数据中检测并处理 Map 类型。

  10. 不要把 $ref 当作 JSON 中的引用(Don’t treat $ref as a reference in JSON): 此选项指示 quicktype 不将 JSON 中的 $ref 视为引用。

  11. 合并相似的类(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;
}

在这个示例中,HiveTypeHiveField 注解用于指定 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/

左侧是其配置选项卡,包括:

  • 类名输入框:
    在这里插入图片描述

  • 类内容选项:
    在这里插入图片描述

  1. Classic: 使用传统的 Dart 代码生成模式,生成的代码包含类似于手动编写的 Dart 类的结构。

  2. Json Serializable: 这个选项用于生成与 JSON 互操作的 Dart 代码。使用类似于json_serializable 这样的库,以简化 Dart 类的 JSON 序列化和反序列化。

  3. Freezed: freezed ,它提供了一种声明式的方式来创建不可变(immutable)类,并自动生成与之相关的代码。

  4. Vexana: 这个选项与 Dart 中的网络请求库 Vexana 相关的。它用于生成与 Vexana 一起使用的 Dart 类,以便更轻松地处理网络请求和响应。

  • 多选选项(用于进一步配置):
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/133266.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

力扣138:随机链表的复制

力扣138:随机链表的复制 题目描述: 给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成&#xff…

基于SSM的培训机构运营系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

【3】Gradle-快速入门使用【Gradle概念】

目录 【3】Gradle-快速入门使用【Gradle概念】Gradle任务查看可用任务了解任务探索任务依赖性 依赖关系了解传递依赖关系查看项目依赖项添加版本目录 【可选】 插件使用插件查看插件提供的任务配置插件 增量构建启用缓存使用构建缓存步骤总结 个人主页: 【⭐️个人主页】 需要您…

JVM虚拟机:垃圾回收器之CMS(老年代)

本文重点 在前面的课程中我们学习了Serial和PO垃圾回收器,本文将学习一种新的在老年代使用的垃圾回收器CMS。 特点 CMS收集器是一种以获取最短回收停顿时间为目标的收集器(还是会有短暂的STW),适合互联网或者B/S系统的服务器上,这类应用尤其重视服务器的响应速度,希望…

反转链表 --- 递归回溯算法练习三

目录 1. 分析题意 2. 分析算法原理 2.1. 递归思路: 1. 挖掘子问题: 3. 编写代码 3.1. step 1: 3.2. step 2: 3.3. step 3: 3.4. 递归代码: 1. 分析题意 力扣原题链接如下: 206. 反转链…

巧用ADB安卓调试工具,在双十一直播间轻松回复文字领取优惠!

微信改版了,现在看到我们全凭缘分,为了不错过【全栈工程师修炼指南】重要内容及福利,大家记得按照上方步骤设置「接收文章推送」哦~ 关注回复【学习交流群】加入【SecDevOps】学习交流群! 文章目录: 1.前言简述 描述: 通过前面几篇…

【AICFD案例教程】进气歧管分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

【那些反爬和反反爬】xpath根据兄弟节点定位元素

其实这篇不涉及什么高大上的反爬,但是实在不知道要把这篇文章归类到哪里,就直接先扔这里吧。 先吐槽一句:萌娘百科绝对是我再也不想爬第二次的网站。 第二句:(真理)把网站弄得越乱越让人摸不着头脑&#…

【2024提前批/秋招笔试汇总2】——大疆-嵌入式软件-2023.08.06

一、 单选题(40分) 1. 以下关于GPU的特点描述不准确的是: A.GPU无法使用共享内存结构,提高通信速度 B.GPU的并行数据处理可以大幅度提高运算能力 C.GPU使用高速全局内存可以进一步提升运算速度 D.GPU的计算能力比CPU强 2.下列关…

技术架构-单机架构

前言 从今天开始系统学习 Docker 课程,总结下 Docker 是什么,用来做什么,架构是怎样的。 注:(1)当浏览器 / APP访问服务器时,如果服务器适用的时 http 协议,那么默认端口时80&#…

Learn runqlat in 5 minutes

内容预告 learn X in 5 系列第一篇. 本篇主要介绍进程时延统计方式和 rawtracepoint. runqlat "高负载场景下应用为何卡顿", "进程 A 为什么得不到调度". 当我们在工作生活中产生这样的疑问, 目标进程的调度时延是一个不错的观测切入点. runqlat 可以帮…

CentOs7 NAT模式连接网络

1.配置动态网络 1.1 检查主机网卡配置 检查主机的网络设置 进入控制面板,找到网络共享中心 查看适配器是否都已经开启 1.2 设置虚拟机的网络配置 打开虚拟机网络配置设置,对网卡VMnet8 进行设置 记住网关 全部选择应用,确定 1.3 设置…

数据结构:树的基本概念(二叉树,定义性质,存储结构)

目录 1.树1.基本概念1.空树2.非空树 2.基本术语1.结点之间的关系描述2.结点、树的属性描述3.有序树、无序树4.森林 3.树的常考性质 2.二叉树1.基本概念2.特殊二叉树1.满二叉树2.完全二叉树3.二叉排序树4.平衡二叉树 3.常考性质4.二叉树的存储结构1.顺序存储2.链式存储 1.树 1.…

PyTorch技术和深度学习——三、深度学习快速入门

文章目录 1.线性回归1)介绍2)加载自由泳冠军数据集3)从0开始实现线性回归模型4)使用自动求导训练线性回归模型5)使用优化器训练线性回归模型 2.使用torch.nn模块构建线性回归模型1)使用torch.nn.Linear训练…

文件改名:避免繁琐操作,利用筛选文件批量重命名技巧优化文件管理

在我们的日常生活和工作中,我们经常需要处理大量的文件,从文档、图片到音频和视频等。在这些情况下,一个高效的文件管理策略至关重要。文件重命名的必要性主要体现在两个方面。首先,对于大量文件,手动进行重命名不仅费…

邻接矩阵储存图实现深度优先遍历(C++)

目录 基本要求: 图的结构体: 图的构造: 图的深度优先(DFS): 图的打印输出: 完整代码: 测试数据: 运行结果: 通过给出的图的顶点和边的信息&#xff0c…

Sprint Boot 学习路线 4

微服务 Spring Microservices是一个框架,它使用Spring框架更容易地构建和管理基于微服务的应用程序。微服务是一种架构风格,其中一个大型应用程序被构建为一组小型、独立可部署的服务。每个服务具有明确定义的职责,并通过API与其他服务通信。…

S7-1200PLC和SMART PLC开放式以太网通信(UDP双向通信)

S7-1200PLC的以太网通信UDP通信相关介绍还可以参考下面文章链接: 博途PLC开放式以太网通信TRCV_C指令应用编程(运动传感器UDP通信)-CSDN博客文章浏览阅读2.8k次。博途PLC开放式以太网通信TSENG_C指令应用,请参看下面的文章链接:博途PLC 1200/1500PLC开放式以太网通信TSEND_…

Flink之Table API SQL连接器

连接器 Table API & SQL连接器1.概述2.支持连接器 DataGen连接器1.概述2.SQL客户端执行3.Table API执行 FileSystem连接器1.创建FileSystem映射表2.创建source数据源表3.写入数据4.解决异常5.查询fileTable6.查看HDFS Kafka连接器1.添加kafka连接器依赖2.重启yarn-session、…

vue.cli 中怎样使用自定义的组件

目录 创建自定义组件 注册并使用自定义组件 全局注册自定义组件 使用 Props 传递数据 总结 前言 在Vue CLI中使用自定义组件是构建交互式和模块化Web应用的重要一环。Vue CLI为开发者提供了使用自定义组件的灵活性和简便性。通过Vue CLI,你可以创建、注册和使…