【Flutter 工程】002-代码生成:Freezed ——类似 Java 的 lombok

news/2024/11/15 16:32:11/

【Flutter 工程】002-代码生成:Freezed ——类似 Java 的 lombok

文章目录

  • 【Flutter 工程】002-代码生成:Freezed ——类似 Java 的 lombok
  • 一、概述
    • 1、简介
    • 2、主要功能
    • 3、主页与使用前后比较
      • 主页
      • 使用前
      • 使用后
  • 二、基本使用
    • 1、安装
    • 2、改造 `main.dart`
    • 3、创建 `home_page.dart`
    • 4、创建类 `message.dart`
    • 5、生成代码
    • 6、运行结果

一、概述

1、简介

Flutter 的 Freezed 是一个代码生成工具,用于帮助开发者在Flutter应用程序中创建不可变(immutable)的数据模型。它基于Dart语言的代码生成功能,通过生成大量的模板代码来简化和加速不可变数据类的创建过程。

使用Freezed,您可以定义数据模型类,并自动生成大量的模板代码,包括等价性比较(equality)、哈希码(hashcode)以及复制(copy)等方法。这些模板代码通过元编程技术生成,大大减少了手动编写重复的样板代码的工作量。

Freezed 还支持对数据模型类进行继承、扩展和合并等操作。您可以在定义数据模型类时添加注解来自定义生成的代码,例如添加额外的方法、定制等价性比较逻辑等。

使用Freezed的好处包括:

  1. 简化不可变数据模型类的创建过程,减少手动编写重复代码的工作量。
  2. 生成的代码可靠且高效,具有良好的性能。
  3. 提供了可自定义的选项,以满足不同的需求和使用场景。
  4. 促使代码更加健壮,减少由于可变状态引起的潜在错误。

总之,Flutter的Freezed是一个强大的代码生成工具,可帮助开发者更轻松地创建不可变的数据模型类,提高代码的可读性、可维护性和性能。

2、主要功能

Freezed 的主要功能包括:

  1. 生成==/hashCode方法。这使您的类变成可哈希和可比较的,可以使用在Set和Map中。
  2. 生成copyWith方法。这允许您轻松创建当前对象的浅拷贝,并在必要时更改某些属性。
  3. 生成toJson和fromJson方法。这使您的类可以轻松与JSON序列化和反序列化。
  4. 生成冻结(freeze)方法。这会返回当前对象的深度冻结(深拷贝)版本。
  5. 支持联合(union)类型。Freezed可以为您生成联合类及其辅助方法。
  6. 支持延迟初始化(late final字段)。Freezed可以正确处理Dart的延迟初始化字段。

3、主页与使用前后比较

主页

https://pub.dev/packages/freezed

使用前

before

使用后

after

二、基本使用

1、安装

flutter pub add freezed_annotation
flutter pub add --dev build_runner
flutter pub add --dev freezed
# if using freezed to generate fromJson/toJson, also add:
flutter pub add json_annotation
flutter pub add --dev json_serializable

2、改造 main.dart

import 'package:flutter/material.dart';
import 'package:study/pages/home_page.dart';void main() {runApp(const MyApp());
}class MyApp extends StatelessWidget {const MyApp({super.key});Widget build(BuildContext context) {return const MaterialApp(home: HomePage(),);}
}

3、创建 home_page.dart

lib/pages/home_page.dart

import 'package:flutter/material.dart';
import 'package:study/models/message.dart';class HomePage extends StatefulWidget {const HomePage({super.key});State<StatefulWidget> createState() => _HomePageState();
}class _HomePageState extends State<HomePage> {late Message message;void initState() {super.initState();// 创建 jsonfinal json = <String, dynamic>{'content': 'Hello World',};message = Message.fromJson(json);}Widget build(BuildContext context) {return Scaffold(appBar: AppBar(title: const Text('Home'),),body: Center(child: Column(children: [// 取内容Text(message.content,style: const TextStyle(fontSize: 40),),// 遍历属性for (var entry in message.toJson().entries)Text('${entry.key}: ${entry.value}',style: const TextStyle(fontSize: 40),),],),),);}
}

4、创建类 message.dart

lib/models/message.dart

import 'package:freezed_annotation/freezed_annotation.dart';part 'message.freezed.dart';part 'message.g.dart';
class Message with _$Message {const factory Message({required String content,}) = _Message;factory Message.fromJson(Map<String, Object?> json) => _$MessageFromJson(json);
}

5、生成代码

# --delete-conflicting-outputs 可选,会在生成代码冲突的时候,删除原来的代码,重新生成
flutter pub run build_runner build --delete-conflicting-outputs

6、运行结果

image-20230522151153299


http://www.ppmy.cn/news/84895.html

相关文章

言之画: AI绘画平台

【产品介绍】 言之画是出门问问推出的AI绘画平台。支持二次元、蒸汽朋克、插画等 8 种创作风格。用户只需输入文字&#xff0c;「言之画」就能一次性生成 8 张光影逼真、细节丰富的 2K 高分辨率图像。 除了以文生图&#xff0c;它还拥有以图生图、动图生成、个性头像生成等 AI …

有意思的CVE-2022-0337复现

前言 前两天在刷tw&#xff0c;看到了个比较有意思的一个CVE漏洞&#xff0c;价值奖励是10000美&#x1f52a;&#xff0c;比较好奇的是价值10000美&#x1f52a;的漏洞是什么样子的[苦涩]&#xff0c;漏洞利用就是需要在浏览器中进行用户交互才能触发该漏洞&#xff0c;但由于…

一文揭秘高效稳定的 Apache Doris 内存管理机制

作者&#xff1a;SelectDB 高级研发工程师、Apache Doris Committer 邹新一 背景 Apache Doris 作为基于 MPP 架构的 OLAP 数据库&#xff0c;数据从磁盘加载到内存后&#xff0c;会在算子间流式传递并计算&#xff0c;在内存中存储计算的中间结果&#xff0c;这种方式减少了频…

如何创建Vue实例?Vue实例有哪些属性和方法

Vue实例就是Vue的实例化对象&#xff0c;就像你有一个iPhone&#xff0c;那么iPhone就是你的实例化对象。要创建Vue实例&#xff0c;就像你想拥有一部iPhone一样&#xff0c;首先要有一个设计图。 这个设计图就相当于Vue实例的options对象&#xff0c;你可以设置它的属性&…

【资料分享】高边、低边晶体管开关及电路解析

高边和低边晶体管开关 电路中&#xff0c;晶体管常常被用来当做开关使用。晶体管用作开关时有两种不同的接线方式&#xff1a;高边&#xff08;high side&#xff09;和低边(low side)。 高边和低边是由晶体管在电路中的位置决定的。晶体管可以是双极性晶体管&#xff08;BJT…

R语言实践——rWCVP:按照物种的原生分布区清洗坐标点

rWCVP&#xff1a;按照物种的原生分布区清洗坐标点 加载库工作流&#xff08;单个物种&#xff09;1. 下载发现记录数据&#xff08;rgbif&#xff09;2. 发现记录的预备3. 获取原生区范围4. 清除非原生分布记录 加载库 library(rWCVP) library(rgbif) library(tidyverse) lib…

【万字长文】深度解析 Transformer 和注意力机制(含完整代码实现)

深度解析 Transformer 和注意力机制 在《图解NLP模型发展&#xff1a;从RNN到Transformer》一文中&#xff0c;我介绍了 NLP 模型的发展演化历程&#xff0c;并用直观图解的方式为大家展现了各技术的架构和不足。有读者反馈图解方式虽然直观&#xff0c;但深度不足。考虑到 Tra…

实验室云检验信息系统(云LIS源码)

一、区域云LIS系统概述&#xff1a; 区域云LIS平台源码&#xff0c;系统完全采用B/S架构模式&#xff0c;扩展性强。整个系统的运行基于WEB层面&#xff0c;只需要在对应的工作台安装一个浏览器软件有外网即可访问。 云LIS系统为实验室服务对象提供检验申请、采集标本、结果查…