【Flutter】built_value 解决 Flutter 中的不可变性问题

news2024/10/6 16:28:45

文章目录

    • 一、 前言
    • 二、 什么是 built_value?
    • 三、 为什么我们需要 built_value?
    • 四、 如何在 Flutter 中安装和设置 built_value?
    • 五、 如何使用 built_value 创建不可变的值类型?
    • 六、 如何使用 built_value 创建枚举类?
    • 七、 如何使用 built_value 进行 JSON 序列化?
    • 八、 版本信息
    • 九、 总结

一、 前言

嗯啊,欢迎大家来到我的博客!这是小雨青年于 2023 年发布在 CSDN 的博客,如果你不是在 CSDN 看到的,请联系我。

今天我们要讨论的主题是 Flutter 中的 built_value 包。在我们开始之前,我想先和大家分享一下,为什么我会选择这个主题。在开发 Flutter 应用的过程中,我们经常会遇到一些状态管理的问题,尤其是当我们的应用逻辑变得越来越复杂的时候。这时候,built_value 就派上了用场。它可以帮助我们创建不可变的值类型,使得我们的代码更加健壮,更易于维护。

🎉想要精通 Flutter,掌握更多技巧和最佳实践?好消息来了!👉 Flutter专栏->Flutter Developer 101 入门小册 正在等你!📚

🔍这里有你需要的所有 Flutter 学习资源,包括代码示例和深度解析。🎯

⏰专栏内容持续更新,价格也会随之上涨。现在加入,享受最优惠的价格!💰

🚀现在,让我们开始今天的 Flutter 之旅吧!🌍

二、 什么是 built_value?

built_value 是一个 Dart 包,它提供了一种强大的、不可变的值类型系统,这对于在 Flutter 中构建复杂的、可预测的状态管理系统非常有用。built_value 的主要功能包括:

  1. 不可变的值类型:这意味着一旦一个对象被创建,它的状态就不能被改变。这可以帮助我们避免由于状态改变而导致的各种问题,使得我们的代码更加健壮。

  2. 枚举类:built_value 提供了一种强大的枚举类系统,它允许我们创建具有枚举行为的类。这对于创建有限的、固定的选项集非常有用。

  3. JSON 序列化:built_value 还提供了一种强大的 JSON 序列化和反序列化系统,这对于处理网络请求和响应非常有用。

三、 为什么我们需要 built_value?

在 Flutter 开发中,我们经常需要处理各种各样的状态管理问题。例如,我们可能需要在多个页面之间共享状态,或者我们可能需要在用户与应用交互的过程中更新状态。在这些情况下,我们需要一种可预测、可靠的方式来管理我们的状态。

这就是 built_value 发挥作用的地方。通过使用 built_value,我们可以创建不可变的值类型,这意味着一旦一个对象被创建,它的状态就不能被改变。这可以帮助我们避免由于状态改变而导致的各种问题,使得我们的代码更加健壮。

此外,built_value 还提供了一种强大的枚举类系统,它允许我们创建具有枚举行为的类。这对于创建有限的、固定的选项集非常有用。例如,我们可以创建一个代表用户状态的枚举类,其中包含了 “在线”、“离线”、“忙碌” 等状态。

最后,built_value 还提供了一种强大的 JSON 序列化和反序列化系统,这对于处理网络请求和响应非常有用。我们可以轻松地将 JSON 数据转换为我们的值类型,或者将我们的值类型转换为 JSON 数据。

四、 如何在 Flutter 中安装和设置 built_value?

要在 Flutter 中使用 built_value,我们首先需要将它添加到我们的 pubspec.yaml 文件中。我们可以在 dependencies 部分添加 built_value,并在 dev_dependencies 部分添加 built_value_generatorbuild_runner。这是一个例子:

dependencies:
  flutter:
    sdk: flutter
  built_value: ^8.6.1

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.1.4
  built_value_generator: ^8.6.1

然后,我们可以运行 flutter pub get 命令来获取这些依赖。

接下来,我们需要创建我们的值类型。我们可以创建一个新的 Dart 文件,并在其中定义我们的值类型。这是一个例子:

import 'package:built_value/built_value.dart';

part 'my_value.g.dart';

abstract class MyValue implements Built<MyValue, MyValueBuilder> {
  String get name;

  MyValue._();
  factory MyValue([void Function(MyValueBuilder) updates]) = _$MyValue;
}

在这个例子中,我们创建了一个名为 MyValue 的值类型,它有一个名为 name 的字段。我们还定义了一个私有的构造函数和一个工厂

构造函数。工厂构造函数接受一个可选的更新函数,我们可以使用这个函数来设置我们的字段的值。

然后,我们需要运行 flutter packages pub run build_runner build 命令来生成我们的值类型的代码。这将生成一个新的 Dart 文件,其中包含了我们的值类型的实现。

最后,我们可以在我们的代码中使用我们的值类型。例如,我们可以创建一个新的 MyValue 对象,如下所示:

final myValue = MyValue((b) => b..name = 'Hello');

在这个例子中,我们使用了 MyValue 的工厂构造函数来创建一个新的 MyValue 对象。我们传递了一个更新函数给工厂构造函数,这个函数设置了 name 字段的值为 ‘Hello’。

五、 如何使用 built_value 创建不可变的值类型?

built_value 中,我们可以通过定义抽象类来创建不可变的值类型。这个抽象类需要实现 Built 接口,并提供两个类型参数:值类型本身和对应的构建器类型。这是一个例子:

import 'package:built_value/built_value.dart';

part 'user.g.dart';

abstract class User implements Built<User, UserBuilder> {
  String get name;
  int get age;

  User._();
  factory User([void Function(UserBuilder) updates]) = _$User;
}

在这个例子中,我们定义了一个 User 类,它有两个字段:nameage。我们还定义了一个私有的构造函数和一个工厂构造函数。工厂构造函数接受一个可选的更新函数,我们可以使用这个函数来设置我们的字段的值。

然后,我们可以使用 User 类的工厂构造函数来创建一个新的 User 对象,如下所示:

final user = User((b) => b
  ..name = 'Tom'
  ..age = 25);

在这个例子中,我们使用了 User 的工厂构造函数来创建一个新的 User 对象。我们传递了一个更新函数给工厂构造函数,这个函数设置了 nameage 字段的值。

六、 如何使用 built_value 创建枚举类?

built_value 还提供了一种创建枚举类的方法。我们可以通过定义抽象类来创建枚举类。这个抽象类需要实现 EnumClass 接口,并提供一个类型参数:枚举类本身。这是一个例子:

import 'package:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';

part 'status.g.dart';

class Status extends EnumClass {
  static const Status online = _$online;
  static const Status offline = _$offline;
  static const Status busy = _$busy;

  const Status._(String name) : super(name);

  static BuiltSet<Status> get values => _$values;
  static Status valueOf(String name) => _$valueOf(name);
}

在这个例子中,我们定义了一个 Status 类,它有三个常量:onlineofflinebusy。我们还定义了一个私有的构造函数,一个获取所有值的 getter,以及一个根据名称获取值的方法。

然后,我们可以在我们的代码中使用我们的枚举类,如下所示:

final status = Status.online;

在这个例子中,我们创建了一个新的 Status 对象,其值为 online

七、 如何使用 built_value 进行 JSON 序列化?

built_value 提供了一种强大的 JSON 序列化和反序列化系统。我们可以轻松地将 JSON 数据转换为我们的值类型,或者将我们的值类型转换为 JSON 数据。

首先,我们需要在我们的值类型中添加 BuiltValue 注解,并实现 BuiltValue 接口。然后,我们需要定义一个静态的 serializer 字段,并通过 _$UserSerializer 创建它的实例。这是一个例子:

import 'package:built_value/built_value.dart';
import 'package:built_value/serializer.dart';

part 'user.g.dart';

abstract class User implements Built<User, UserBuilder> {
  static Serializer<User> get serializer => _$userSerializer;

  String get name;
  int get age;

  User._();
  factory User([void Function(UserBuilder) updates]) = _$User;
}

然后,我们可以使用 serializers 对象来进行 JSON 序列化和反序列化。例如,我们可以将一个 User 对象序列化为 JSON 数据,如下所示:

import 'package:built_value/serializer.dart';
import 'package:built_collection/built_collection.dart';

final serializers = (Serializers().toBuilder()
      ..addPlugin(StandardJsonPlugin())
      ..add(User.serializer))
    .build();

final user = User((b) => b
  ..name = 'Tom'
  ..age = 25);

final json = serializers.serializeWith(User.serializer, user);

在这个例子中,我们首先创建了一个 User 对象。然后,我们使用 serializers 对象和 User.serializer 来将 User 对象序列化为 JSON 数据。

同样,我们也可以将 JSON 数据反序列化为一个 User 对象,如下所示:

final user = serializers.deserializeWith(User.serializer, json);

在这个例子中,我们使用 serializers 对象和 User.serializer 来将 JSON 数据反序列化为一个 User 对象。

八、 版本信息

在编写本文时,我使用的 Flutter 版本为 3.10.0,Dart SDK 的版本为 3.0.0。

请注意,由于 Flutter 和 Dart SDK 的版本可能会随着时间的推移而更新,因此在你阅读本文时,可能需要使用不同的版本。你可以在 Flutter 和 Dart SDK 的官方网站上查看最新的版本信息。

九、 总结

在本文中,我们详细介绍了如何在 Flutter 中使用 built_value 包。我们首先介绍了什么是 built_value,以及为什么我们需要 built_value。然后,我们介绍了如何在 Flutter 中安装和设置 built_value,以及如何使用 built_value 创建不可变的值类型和枚举类。最后,我们介绍了如何使用 built_value 进行 JSON 序列化。

我希望这篇文章能帮助你理解和使用 built_value。如果你有任何问题或建议,欢迎在评论区留言。我会尽快回复你。

🚀对 Flutter 好奇?想深入探索?👉 Flutter专栏->Flutter Developer 101 入门小册 是你的最佳伙伴!📚

👀你将在这里找到全面的 Flutter 学习资源,包括代码示例和深度解析。🔍

💡想知道如何用 Flutter 构建应用?答案就在我们的专栏!🎯

⏰别等了,专栏内容持续更新,价格也会随之上涨。现在加入,享受最优惠的价格!💰

🌍一起在 Flutter 的世界中探索吧!想了解更多?点击这里:Flutter Developer 101 入门小册 专栏指引 🚩

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

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

相关文章

pcl基于八叉树进行空间划分和搜索操作

建立空间索引在点云数据处理中已被广泛应用&#xff0c;常见空间索引一般是自顶向下逐级划分空间的各种空间索引结构&#xff0c;比较有代表性的包括 BSP 树、KD 树、KDB 树、 R树、R树、CELL 树、四叉树和八叉树等索引结构&#xff0c;而在这些结构中 KD 树和八叉树在 3D点云数…

使用键鼠网络共享用windows控制ubuntu,实现跨屏跨系统操作

经调研发现几种网络共享鼠标方案&#xff1a;sharemouse、synergy以及Barrier&#xff0c;由于没找到合适的资料去配置sharemouse&#xff0c;synergy又收费&#xff0c;所以使用Barrier。 一、Ubuntu安装Barrier 到Ubuntu软件商城搜索Barrier点击安装即可&#xff0c;这就不再…

学成在线----day8

1、课程发布 为了提高网站的速度需要将课程信息进行缓存&#xff0c;并且要将课程信息加入索引库方便搜索&#xff0c;下图显示了课程发布后课程信息的流转情况&#xff1a; 1、向内容管理数据库的课程发布表存储课程发布信息&#xff0c;更新课程基本信息表中发布状态为已发…

【Shell】读取用户终端输入内容

授权 cd /Users/lion/Downloads/shell-test-demos chmod ux *.shread_user_enter.sh #!/bin/bashprintHelp() {echo "1. hello"echo "2. world"echo "0. exit" }printHelpnumber"" while [ -z $number ]; doread -p "enter a n…

干货,让微信群活跃的秘籍

微信用户数量庞大、使用率高&#xff0c;是很多企业/商家做社群营销的第一平台&#xff0c;所以目前有很多微信社群营销管理系统。我一直在用的一个多群管理工具---微信管理系统&#xff0c;对于新手来说&#xff0c;操作也是十分的简单易上手&#xff0c;每一步都有教程指导&a…

网站被黑挂马应该怎么解决

遇到网站被黑或者被挂马&#xff0c;其实都是很正常的现象&#xff0c;做网站的站长&#xff0c;几乎都有网站被黑的历史 遇到这种问题&#xff0c;首先&#xff1a; 检查网站源文件的日期&#xff0c;回顾一下在过去一段时间里面&#xff0c;你有没有对源文件做过改动&#x…

程序员性能之道,从使用perf开始!

一、perf简介 从2.6.31内核开始&#xff0c;Linux内核自带了一个性能分析工具perf&#xff0c;能够进行函数级与指令级的热点查找。通过它&#xff0c;应用程序可以利用 PMU&#xff0c;tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题…

Apikit 自学日记:使用脚本处理数据

脚本分为 前置脚本 和 后置脚本 两种&#xff0c;分别对应 API 请求前 和 返回数据后 的两个阶段。您可以通过编写 Javascript 代码&#xff0c;在 API 前置脚本中改变请求参数&#xff0c;或者是在 API 后置脚本中改变返回结果。 脚本常用于以下几种情况&#xff1a; API 请求…

【夜深人静学数据结构与算法 | 第十一篇】枚举算法

目录 前言&#xff1a; 枚举算法&#xff1a; 优点&#xff1a; 枚举算法的种类&#xff1a; 枚举算法案例&#xff1a; 343. 整数拆分 - 力扣&#xff08;LeetCode&#xff09; 12. 整数转罗马数字 - 力扣&#xff08;LeetCode&#xff09; 总结&#xff1a; 前言&…

video-05-videojs编写(全屏、非全屏)自定义控件!!!!

兄弟们&#xff01;&#xff01;看到这里&#xff0c;你马上就可以自定义控件了&#xff0c;想想是不是都激动啊&#xff0c;但是这篇文章重在思路及简单实现&#xff0c;仔细看。 目录 一、控件分类 二、实现方案&#xff08;方案二最好&#xff09; 2.1 方案1&#xff08;…

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate

前端Vue自定义轮播图swiper 轮播图dot 轮播图指示indicate&#xff0c;下载完整代码请访问uni-app插件市场地址&#xff1a;https://ext.dcloud.net.cn/plugin?id13193 效果图如下: ​ 编辑切换为居中 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; ​…

BACnet网关如何采集Modbus RTU设备转BACnet IP协议

BACnet标准是针对采暖、通风、空调、制冷控制设备设计的&#xff0c;同时也是为其他楼宇控制系统(例如照明&#xff0c;安保&#xff0c;消防等系统)的集成提供一个基本原则。 本文主要讲述了BACnet网关采集Modbus RTU设备&#xff08;M140T&#xff09;&#xff0c;将Modbus …

servlet拓展-统一响应json功能、全局异常处理

servlet拓展-统一响应json功能、全局异常处理 一、baseservlet import com.fasterxml.jackson.databind.ObjectMapper; import teamwork.com.utils.ApiResult;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.Htt…

解决IDEA连接数据库后,xml中写SQL语句不提醒数据库表字段问题

有时候我们新建了一个项目&#xff0c;或者新建了一个工程&#xff0c;明明为此项目或者工程连接了数据库&#xff0c;并且一切正确&#xff0c;但是在xml中书写SQL语句就是不提示数据库表中的相关字段&#xff0c;无论是表名也好&#xff0c;还是字段名也好&#xff0c;通通不…

信号链噪声分析15

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 模数转换器(ADC)将模拟量——现实世界中绝大部分现象的特征——转换为数字语言&#xff0c; 以便用于信息处理、计算、数据传输和控制系统。数模转换器(DAC)则用于将发送或存 储…

信号链噪声分析17

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 只是快速阅读 HarryNyquist 于 1924 年发表的《贝尔系统技术杂志》经典文章&#xff0c;并不 足以了解以其名字命名的该项准则的真正意义。当时&#xff0c;Nyquist 正致力于研…

解放双手,保障企业安全这一点很重要!

无论是交通管理部门、工业企业还是其他需要保障安全的场所&#xff0c;远程烟雾监控系统都是一个可靠的选择。 这远程烟雾监控是一项重要的技术解决方案&#xff0c;通过使用先进的传感器和监控系统来实时监测和管理烟雾情况&#xff0c;以提高安全性并及时应对潜在的风险。 客…

强化学习从基础到进阶–案例与实践[11]:AlphaStar论文解读、监督学习、强化学习、模仿学习、多智能体学习、消融实验

【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧&#xff08;调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍&#xff1a;【强化学习原理项目专栏】必看系列&#xff1a;单智能体、多智能体算法原理项目实战、相关技巧…

H5工具:产品生命周期四阶段及其重点关注数据指标

人有生老病死&#xff0c;同样&#xff0c;一个产品也有生命周期&#xff0c;叫产品生命周期&#xff08;Product Life Cycle&#xff09;。 产品生命周期指的是产品从进入市场到退出市场的周期性变化过程&#xff0c;它是指产品的市场寿命&#xff0c;而非产品的使用寿命。 一…

Linux自主学习 - C语言库Melon的快速入门

备注&#xff1a;ubuntu-20.04.3-desktop-amd64.iso 一、C语言库melon的安装 1、选择一个合适的文件夹用于下载Melon&#xff0c;本文以~/ProjectCode为例 在~/ProjectCode下输入git clone https://github.com/Water-Melon/Melon.git 然后&#xff0c;可以使用ls命令查看到Mel…