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

文章目录

    • 一、 前言
    • 二、 什么是 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: flutterbuilt_value: ^8.6.1dev_dependencies:flutter_test:sdk: flutterbuild_runner: ^2.1.4built_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.hqwc.cn/news/1738.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

瓶盖扫码回收APP系统 废旧物品创造价值收益

资源回收再利用是近些年国家大力倡导的&#xff0c;人们也在积极践行&#xff0c;从垃圾回收、废旧衣物回收、烟盒回收等等.....今天小白要带大家了解的是瓶盖回收APP软件开发的相关事项。瓶盖回收APP是本着资源回收的初衷&#xff0c;可以时间废旧瓶盖的多次利用&#xff0c;减…

Springboot的自动装配解读

目录 1.Springboot的自动装配 1.1 组件装配 1.1.1 组件 1.2 Spring Framework 的模块装配 1.2.1 Import注解 1.2.2 BeanDefinition 1.3 Spring Framework 的条件装配 1.3.1 Profile 1.3.2 Conditional 1.3.3 MetaData元数据接口&#xff08;补充&#xff09; Annot…

LLM - Hugging Face 工程 BERT base model (uncased) 配置

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131400428 BERT是一个在大量英文数据上以自监督的方式预训练的变换器模型。这意味着它只是在原始文本上进行预训练&#xff0c;没有人以…

报错:Information:java: javacTask: 源发行版 8 需要目标发行版 1.8

1.背景 编译项目或启动项目报错 2.解决方法 设置为对应的版本 3.完美

mybatis 模拟03

pom.xml: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0…

【python】—— 基础语法(二)

序言&#xff1a; 在上期&#xff0c;我们已经对python进行了初步的学习和了解。本期&#xff0c;我将继续带领大家学习关于python的基本知识&#xff01;&#xff01; 目录 &#xff08;一&#xff09;顺序语句 &#xff08;二&#xff09;条件语句 1、什么是条件语句 2、…

Vue2封装一个全局通知组件并发布到NPM

✍&#x1f3fc;作者&#xff1a;周棋洛&#xff0c;计算机学生 ♉星座&#xff1a;金牛座 &#x1f3e0;主页&#xff1a;点击查看更多 &#x1f310;关键&#xff1a;vue2 组件封装 npm发包 文章目录 1. 前言 &#x1f343;2. 我为什么要封装通知插件 ❓3. 初始化vue空项目 &…

EasyDSS视频直播点播平台视频回看列表显示为ID的排查与优化

视频直播点播EasyDSS平台具备灵活的视频能力&#xff0c;包括直播、点播、转码、管理、录像、检索、时移回看等&#xff0c;平台支持音视频采集、视频推拉流、播放H.265编码视频、存储、分发等能力服务&#xff0c;可应用在无人机推流、在线直播、虚拟直播、远程培训等场景中。…

postgresql 从应用角度看快照snapshot使用,事务隔离控制不再神密

​专栏内容&#xff1a;postgresql内核源码分析 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 快照使用 快照是事务中使用&#xff0c;配合事务的隔离级别&#xff0c;体现出不同的可见性。…

商品减库在Redis中的运用

一.商品减库中存在问题 1.传统的代码 1.1引入jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.…

计算机网络——传输层

序言 计算机网络中的传输层在当今的社会起到了什么作用&#xff1f; 计算机网络中的传输层在通信和数据传输方面起着至关重要的作用。传输层是计算机网络体系结构中的一层&#xff0c;它负责提供端到端的可靠数据传输和通信服务&#xff1b;有着以下几个方面作用&#xff1a;可…

python生成日报

目录 一&#xff1a;日报生成工具二&#xff1a;日报工具使用方式三&#xff1a;最终日报生成展示 一&#xff1a;日报生成工具 #!/usr/bin/python # coding:utf8class GetHtml(object):def __init__(self):self._html_head """<html><body style&qu…