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

news2024/11/18 2:41:19
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 类,以便更轻松地处理网络请求和响应。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Easyui DataGrid combobox联动下拉框内容

发票信息下拉框联动,更具不同的发票类型,显示不同的税率 专票 普票 下拉框选择事件 function onSelectType(rec){//选中值if (rec2){//普通发票对应税率pmsPlanList.pmsInvoiceTaxRatepmsPlanList.pmsInvoiceTaxRateT}else {//专用发票对应税率pmsPlan…

置换环算法

参考该博客大佬的讲解 置换环 - TTS-S - 博客园 (cnblogs.com) 置换环:一般用于解决数组排序元素间所需最小交换次数这类问题。 置换环思想:置换环是将每个元素指向其应在的位置,最终相连成一个环(若元素就在其应在的位置,则自身…

js 根据当前时间往前推15天或往后推15天等(例如当前时间往后15天后的日期。并实现今天、明天、后天、周)

本次分享,在项目中开发车票购买功能需要用到日期筛选 思路: 1、首先获取当前时间戳 2、根据当前时间戳拿到15天后的日期 3、根据天匹配星期几 4、将时间戳转换年、月、日并重组 实现代码 // 获取当前日期 const today new Date();// 往前推15天的…

【数据结构】树与二叉树(七):二叉树的遍历(先序、中序、后序及其C语言实现)

文章目录 5.2.1 二叉树二叉树性质引理5.1:二叉树中层数为i的结点至多有 2 i 2^i 2i个,其中 i ≥ 0 i \geq 0 i≥0。引理5.2:高度为k的二叉树中至多有 2 k 1 − 1 2^{k1}-1 2k1−1个结点,其中 k ≥ 0 k \geq 0 k≥0。引理5.3&…

Interactive Analysis of CNN Robustness

Interactive Analysis of CNN Robustness----《CNN鲁棒性的交互分析》 摘要 虽然卷积神经网络(CNN)作为图像相关任务的最先进模型被广泛采用,但它们的预测往往对小的输入扰动高度敏感,而人类视觉对此具有鲁棒性。本文介绍了 Pert…

优雅关闭TCP的函数shutdown效果展示

《TCP关闭的两种方法概述》里边理论基础,下边是列出代码,并且进行实验。 服务端代码graceserver.c的内容如下: #include "lib/common.h"static int count;static void sig_int(int signo) {printf("\nreceived %d datagrams\…

让各大运营商都默默流泪的 HTTPS 协议(HTTPS 的加密流程)

文章目录 前言1. 什么是 HTTPS1.1 臭名昭著的 "运营商劫持" 2. 什么是"加密"3. HTTPS 的加密流程3.1 对称加密用对称加密可行吗? 3.2 引入非对称加密用对称加密非对称加密可行吗? 3.3 中间人攻击如何证明浏览器收到的公钥一定是该网…

Linux系统上搭建高可用Kafka集群(使用自带的zookeeper)

本次在CentOS7.6上搭建Kafka集群 Apache Kafka 是一个高吞吐量的分布式消息系统,被广泛应用于大规模数据处理和实时数据管道中。本文将介绍在CentOS操作系统上搭建Kafka集群的过程,以便于构建可靠的消息处理平台。 文件分享(KafkaUI、kafka…

matplotlib 创建图和子图

Matplotlib 可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。这里将会探索 matplotlib 的常见用法。 plt方式是先生成了一个画布,然后在这个画布上隐式的生成一个画图区域来进行画图&#xff1…

提升中小企业效率的不可或缺的企业云盘网盘

相比之大型企业,中小型企业在挑选企业云盘工具更注重灵活性和成本。那么市面上有哪些企业云盘产品更适合中小企业呢? 说起中小企业不能错过的企业云盘网盘,Zoho Workdrive企业云盘绝对榜上有名! Zoho Workdrive企业云盘为用户提…

利用Python代码提取shp中每个区域的图像

import geopandas as gpd import rasterio from rasterio.mask import mask import matplotlib.pyplot as plt import numpy as np# 载入shp文件 - 它只包含几何对象 shapefile_path rD:\Desktop\新建文件夹 (3)\01.shp shapes gpd.read_file(shapefile_path)# 打开图像 imag…

杂记杂记杂记

目录 Mybatis分页插件原理? ThreadLocal? 树形表的标记字段是什么?如何查询MySQL树形表? Mybatis的ResultType和ResultMap的区别? #{}和${}有什么区别? 系统如何处理异常? Mybatis分页插件原理&#…

家居美学:将水离子壁炉融入你的现代装饰

当谈及家居装饰和壁炉选择时,水离子雾化壁炉是一个备受瞩目的话题。水离子雾化壁炉的美学价值,还为室内装饰带来全新的维度。它甚至能够激发室内装饰的灵感。 水离子雾化壁炉是现代美学的标志,融合了简洁、线条清晰的设计。这种壁炉常常采用不…

Java性能测试中常用的锁

多线程编程在现代软件开发中扮演着至关重要的角色。它使我们能够有效地利用多核处理器和提高应用程序的性能。然而,多线程编程也伴随着一系列挑战,其中最重要的之一就是处理共享资源的线程安全性。在这个领域,锁(Lock)…

compile: version “go1.19“ does not match go tool version “go1.18.1“

** 1 安装了新版本的go后 为什么go version 还是旧版本? ** 如果你已经按照上述步骤安装了新版本的 Go,但 go version 命令仍然显示旧版本,可能是因为你的环境变量设置不正确或未正确生效。你可以尝试以下方法来解决问题: 重新…

在PyTorch中使用CUDA, pytorch与cuda不同版本对应安装指南,查看CUDA版本,安装对应版本pytorch

目录 1 查看本机CUDA版本 2 查看对应CUDA的对应pytorch版本安装 3 用pip 安装 4 用conda安装 5 验证安装 在PyTorch中使用CUDA,根据你的具体环境和需求调整版本号,确保安装的PyTorch版本与你的CUDA版本兼容。 在PyTorch中使用CUDA,你需…

品牌滥用申诉

指导 据了解,有以下几种情况可能会出现品牌滥用: 第一种:店铺存在问题 包括但不限于以下问题:店铺绩效中有感叹号、店铺 rating 少于 4.5 分、ODR 超标、被变狗 过、二手货投诉、商标版权专利侵权等。 第二种:品牌授…

深入浅出Python异常处理 - 你所不知道的Python异常

深入浅出Python异常处理 - 你所不知道的Python异常 前言 在Python编程开发中,异常处理扮演者至关重要的角色。合适的异常处理不仅可以提高代码的健壮性,还能增强程序的可读性和可维护性。在Python编程中,有效地管理异常是提高代码质量的关键…

腾讯小程序音视频 TRTC live-pusher 黑屏等各种问题

微信小程序进行音视频开发, 主要会用到live-player live-pusher,这两个媒体组件. 在开发的过程中,会遇到各种各样的问题,其中最直接的就是黑屏问题, 以下就这个问题进行整理. 文档: https://developers.weixin.qq.com/miniprogram/dev/component/live-player.html https://dev…

【CASS精品教程】cass3d加载点云(.ilas和.las)并处理应用

本文讲解cass11.0 3d中将las点云转为ilas加载并进行后续处理。(cass11.0下载与安装) 一、ilas点云格式介绍 点云ilas格式是现今数字化三维模型建模的--种普遍被使用的数据格式,也被称作点云、点集或聚集点。它把地球表面上的物体,比如森林、海洋、河流、山脉等自然物体,以…