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

news2024/10/6 1:38:51

【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();
    // 创建 json
    final 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.coloradmin.cn/o/554801.html

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

相关文章

pygam第4课——颜色监测(迷宫小游戏)

前言&#xff1a;前三节课我们学习了&#xff0c;窗口的创建、图片的加载、常用鼠标事件的等。今天我们学一个颜色的监测&#xff0c;并自制一个迷宫小游戏。那我们一下来看看吧 前面的三节课在这里&#xff0c;大家记得关注收藏一下&#xff1a; 视频演示 1、界面搭建 背景图…

开发者关系工程师如何帮助开发者在Sui上构建

近期&#xff0c;我们与Sui开发者关系负责人Brian Hennessey-Hsien进行了对话&#xff0c;就Sui上的开源、去中心化和开发者成就等话题展开讨论。 日前&#xff0c;我们采访了Sui基金会的开发者关系负责人Brian Hennessey-Hsieh&#xff0c;共同探讨了其对于Web3中开发者发展历…

冷热温度正反向控制技术在换热器热疲劳试验中的应用

摘要&#xff1a;空调换热器需要进行可靠性试验以满足整机产品在不同环境下的寿命周期&#xff0c;温度交变试验是可靠性试验中是较为关键的一项。本文在现有PLC交变温度控制技术基础上&#xff0c;提出了一种模块式的改进解决方案&#xff0c;即增加了专用的高精度PID调节器分…

不入耳耳机的正确打开方式,韶音OpenFit诠释耳机的“舒适圈”

文 | 智能相对论 作者 | 佘凯文 总有人说&#xff0c;人们需要跳出舒适圈&#xff0c;逼着自己去不断挑战。也有人问&#xff0c;我满足现状&#xff0c;为什么要跳出舒适圈&#xff1f;说到底&#xff0c;两种说法都没有错&#xff0c;不过该不该走出舒适圈或许也得分“场合…

麻了,最好不要去外包,干了三年,废了一半......

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

【coding加油站】vue单页面图书管理系统

1、引言 设计结课作业,课程设计无处下手&#xff0c;网页要求的总数量太多&#xff1f;没有合适的模板&#xff1f;数据库&#xff0c;java&#xff0c;python&#xff0c;vue&#xff0c;html作业复杂工程量过大&#xff1f;毕设毫无头绪等等一系列问题。你想要解决的问题&am…

数据结构课程设计——运动会分数统计

运动会分数统计 数据结构课程设计任务书 学生姓名&#xff1a;xxx 专业班级&#xff1a;软件工程 指导教师&#xff1a; 工作单位&#xff1a; 题 目: 运动会分数统计 基础要求&#xff1a; 要求具有C语言的理论基础…

ProtoBuf安装及避坑指南

文章目录 安装前注意事项(避坑)ProtoBuf在Linux下的安装protoBuf 测试demo 安装前注意事项(避坑) 1.安装前&#xff0c;我们需要升级g&#xff0c;使用较新的g编译器。 2.在安装过程中&#xff0c;出现问题&#xff0c;可以选择安装其他版本&#xff0c;在加压文件下执行make …

NFTScan:05.15~05.21 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.05.15 ~ 2023.05.21 NFT Hot News&#xff1a;NFT 热点资讯 01/ DID 解决方案提供商 Lifeform 以 3 亿美元估值完成 IDG Capital 领投的 B 轮融资 5 月 15 日&#xff0c;去中心化…

Rocketmq常用使用场景

RocketMQ 是阿里开源的分布式消息中间件&#xff0c;跟其它中间件相比&#xff0c;RocketMQ 的特点是纯JAVA实现 基础概念 Producer&#xff1a; 消息生产者&#xff0c;负责产生消息&#xff0c;一般由业务系统负责产生消息 Producer Group&#xff1a; 消息生产者组&#xf…

ESP32CAM---利用Vscode阅读源码

前言 &#xff08;1&#xff09;首先&#xff0c;我在此吐槽一些&#xff0c;arduino平台的代码阅读功能&#xff0c;是真滴垃圾。气死我了。配置这玩意搞了半天&#xff0c;还没搞好。 &#xff08;2&#xff09;最后我决定使用Vscode阅读arduino的代码。arduino IDE负责编译程…

智能工厂已成为制造业数字化转型的重心

我国“十四五”规划纲要提出&#xff0c;要深入实施智能制造和绿色制造工程&#xff0c;发展服务型制造新模式&#xff0c;推动制造业高端化智能化绿色化。随着5G等新一代信息技术与制造业不断深度融合&#xff0c;制造业的智能化发展成为未来我国制造业转型升级的重要方向。《…

MyBatisPlus快速入门(一)MyBatisPlus简介、历史和优势

一、什么是 MyBatisPlus&#xff1f;二、MyBatisPlus 相关文档2.1 官网2.2 Github源码2.3 官方文档 三、MyBatisPlus 的历史四、MyBatisPlus 的特性和优势4.1 特性4.2 优势 五、如何学习 MyBatisPlus & 专栏计划 一、什么是 MyBatisPlus&#xff1f; MyBatisPlus&#xff…

MyBatis中使用第三方分页插件PageHelper完成分页功能

文章目录 一、前言二、基于插件拦截方式1、自定义插件2、使用第三方插件完成分页1、分页插件的配置2、分页插件的使用 一、前言 分页是web应用程序非常重要的一个技术。数据库中的数据可能是成千上万的&#xff0c;不可能把这么多的数据一次显示在浏览器上面。一般根据每行数据…

2023年4月CSDN客服月报|解决3个重大问题和26个次要问题,采纳1个用户建议

听用户心声&#xff0c;解用户之需。hello&#xff0c;大家好&#xff0c;这里是《CSDN客诉报告》第19期&#xff0c;接下来就请大家一同回顾我们4月份解决的bug&#xff5e; 一、重大问题 1、【猿如意】ChitGPT近期老是提示“我回答不过来”的问题 反馈量&#xff1a;10 2、…

【星戈瑞】Sulfo-Cyanine7 maleimide磺化CY7标记马来酰亚胺

水溶性Cyanine7 mal是一种常用的细胞标记物&#xff0c;可以被用于细胞荧光成像等应用中。它的分子结构中含有Cyanine7和mal两部分&#xff0c;其中Cyanine7是一种红外荧光染料&#xff0c;可以发出红外光&#xff0c;而mal则是一种水溶性的化合物&#xff0c;可以使Cyanine7分…

响应式与自适应的区别

响应式与自适应的区别&#xff1a; 响应式&#xff1a;一套适配多端适配不同的屏幕设备&#xff0c;即不同的视口分辨率 自适应&#xff1a;多套页面不同视口分辨率大小显示同样的网页rem、百分比等相对单位 注意&#xff1a; 在开发中&#xff0c;项目的响应式&#xff0c;一些…

Java技术接单

今天给大家介绍一个阶段性&#xff08;周期性&#xff09;能获取一定收益的Java技术接单群&#xff0c;分享给大家&#xff01;主要对搞Java的粉丝有帮助&#xff0c;因为可以赚点小钱&#xff0c;对Java技术的要求不高&#xff01; 那些感兴趣或者想直接加技术群的我给大家讲一…

JAVA8 Stream

1 Steam流式思想概述 Stream和IO流(InputStream/OutputStream)没有任何关系&#xff0c;请暂时忘记对传统IO流的固有印象&#xff01; Stream流式思想类似于工厂车间的“生产流水线”&#xff0c;Stream流不是一种数据结构&#xff0c;不保存数据&#xff0c;而是对数据进行加…

Vue 3 第二十一章:组件九(组件高级特性-组件的混入和继承)

文章目录 1. 组件的混入2. 组件的继承总结 Vue 中的组件混入和继承功能允许我们在多个组件之间共享代码&#xff0c;从而提高代码的可重用性和可维护性。 1. 组件的混入 混入是一种将多个对象合并为一个对象的技术。在 Vue 3 中&#xff0c;我们可以使用 mixins 属性来定义混…