首页/新闻资讯/正文详情

HydratedCubit Brick 完整指南:用 Mason 一键生成可持久化 Cubit

发布时间:2026/9/23 14:03:19 来源:云帆数科 栏目:资讯中心
HydratedCubit Brick 完整指南:用 Mason 一键生成可持久化 Cubit
前端【免费下载链接】blocA predictable state management library that helps implement the BLoC design pattern项目地址https://gitcode.com/gh_mirrors/bl/bloc点击查看免费下载HydratedCubit 是 bloc 状态管理库提供的「可持久化 Cubit」形态它继承了HydratedCubit通过toJson/fromJson将状态自动持久化到本地存储App 重启后无需手动恢复状态。本指南以仓库中bricks/hydrated_cubit官方 BrickMason 模板为核心讲解它的演进历史、模板结构、生成方式与三种代码风格basic / equatable / freezed并深入其源码细节帮助你快速生成、定制并正确落地可持久化的 Cubit 代码。一、Brick 是什么hydrated_cubit的定位bricks/hydrated_cubit是 bloc 仓库中官方维护的一组 Mason Brick定位是「Generate a new HydratedCubit in Dart. Built for the bloc state management library」见 README.md。它服务于以下两类典型场景已有基于hydrated_bloc的 Dart / Flutter 项目需要快速创建带本地持久化能力的 Cubit 骨架团队需要统一 Cubit 代码风格避免每个人手写结构不一致。与普通cubitBrick 的关键区别在于生成的类继承自HydratedCubitT而非CubitT因此模板强制要求实现toJson与fromJson两个方法这也是持久化能力所在。与之配套的还有hydrated_bloc完整 Bloc与replay_cubit/replay_bloc等兄弟 Brick共同组成 bloc 生态的模板体系。二、版本演进从 0.1.0 到 0.3.0Brick 的版本历史完整记录在 CHANGELOG.md 中其演进脉络清晰反映了模板能力的扩展过程版本变更类型内容0.1.0feat初始发布支持 basic 风格的 hydrated cubit 生成0.1.1docs对 README 做小幅更新0.1.2docsREADME 增加徽章badges并使用深色 Logo 变体0.1.3fix修复 part 指令与 import 的声明问题0.2.0feat新增equatable与freezed两种风格的模板支持0.2.1chore更新版权年份与 Logo 图片引用0.3.0chore升级依赖mason ^0.1.0hooks 升级至dart ^3.5.4可以提炼出三条事实模板能力分层演进0.1.0 仅支持 basic 风格0.2.0 才引入 equatable 与 freezed因此style变量见下文的三个取值并非同时出现0.1.3 的 part/imports 修复对应模板文件中part {{name.snakeCase()}}_state.dart;与part of的配对关系这正是多文件生成 Brick 最容易出错的地方0.3.0 对齐了工具链版本Brick 依赖mason ^0.1.0hooks 运行环境要求dart ^3.5.4使用时需确保本地 mason CLI 与 Dart SDK 满足该约束可核对 brick.yaml 与 hooks/pubspec.yaml。三、使用方式一条命令生成两个文件按 README.md 的说明使用方式极其简单mason make hydrated_cubit --name counter --style basic执行后会在当前目录下生成├── counter_cubit.dart └── counter_state.dart使用前提本地已安装 Mason CLI。生成的counter_cubit.dart与counter_state.dart需要放置在你的lib/目录中并确保pubspec.yaml已引入hydrated_blocfreezed 风格还需freezed_annotation与 build_runner 配合。四、变量与参数name 与 style 详解Brick 的输入变量定义在 brick.yaml 中共两个变量类型默认值可选值说明namestringcounter任意字符串Cubit 类名命令行交互提示 Please enter the cubit name.styleenumbasicbasic、equatable、freezed生成模板风格交互提示 What is the cubit style?命令行交互方式不传参时按提示输入mason make hydrated_cubit # ? Please enter the cubit name. counter # ? What is the cubit style? basicname在模板中会被 Mason 的变量修饰器进一步处理{{name.snakeCase()}}用于文件名与 part 指令如counter_cubit.dart{{name.pascalCase()}}用于类名如CounterCubit/CounterState。style的分流逻辑并不写在模板的 if 条件里而是由 hooks/pre_gen.dart 在生成前将枚举值转换为三个布尔变量final style context.vars[style]; context.vars { ...context.vars, use_basic: style basic, use_equatable: style equatable, use_freezed: style freezed, };随后模板主文件 {{name.snakeCase()}}_cubit.dart%7D%7D_cubit.dart) 通过 Mustache 区块按需引入对应片段{{#use_freezed}}{{ freezed_cubit }}{{/use_freezed}}{{#use_equatable}}{{ equatable_cubit }}{{/use_equatable}}{{#use_basic}}{{ basic_cubit }}{{/use_basic}}{{name.snakeCase()}}_state.dart%7D%7D_state.dart) 采用相同的三段式分发。这种「pre_gen 预计算变量 主文件按片段拼接」的模式是 Mason 多风格 Brick 的通用最佳实践便于后续新增风格时只需添加片段文件与 hook 分支。五、三种生成风格与底层实现剖析5.1 basic最小可持久化 Cubitbasic 风格的 Cubit 模板见 {{~ basic_cubit }}import package:hydrated_bloc/hydrated_bloc.dart; part counter_state.dart; class CounterCubit extends HydratedCubitCounterState { CounterCubit() : super(const CounterState()); override MapString, dynamic toJson(CounterState state) { // TODO: implement toJson } override CounterState fromJson(MapString, dynamic json) { // TODO: implement fromJson } }对应状态模板见 {{~ basic_state }}part of counter_cubit.dart; class CounterState { const CounterState(); }两个要点继承自HydratedCubitT这是与普通 Cubit 模板的核心差异。HydratedCubit位于仓库的 packages/hydrated_bloc 包中它在每次emit新状态后自动调用toJson序列化并写入存储在 App 启动恢复时调用fromJson反序列化从而在原生状态管理之上叠加了透明的本地持久化能力模板刻意留白toJson/fromJson以// TODO: implement占位交由开发者按自己的状态模型填充因为 Brick 无法预知业务状态的字段结构。5.2 equatable带值比较的持久化状态equatable 风格的 Cubit 与 basic 几乎一致仅 import 增加equatable关键差异在状态模板 {{~ equatable_state }}part of counter_cubit.dart; class CounterState extends Equatable { const CounterState(); override ListObject get props []; }props目前为空列表生成后需按业务字段补充例如class CounterState extends Equatable { const CounterState({this.count 0}); final int count; override ListObject get props [count]; }Equatable的价值在于当状态值未变化时与hashCode判定相等bloc 生态可据此跳过冗余 rebuild从而减少不必要的 Widget 重建与状态派发。5.3 freezed代码生成与不可变状态freezed 风格引入 Dart 代码生成Cubit 模板见 {{~ freezed_cubit }}import package:freezed_annotation/freezed_annotation.dart; import package:hydrated_bloc/hydrated_bloc.dart; part counter_state.dart; part counter_cubit.freezed.dart; class CounterCubit extends HydratedCubitCounterState { CounterCubit() : super(const CounterState.initial()); override MapString, dynamic toJson(CounterState state) { // TODO: implement toJson } override CounterState fromJson(MapString, dynamic json) { // TODO: implement fromJson } }状态模板见 {{~ freezed_state }}part of counter_cubit.dart; freezed class CounterState with _$CounterState { const factory CounterState.initial() _Initial; }两个值得注意的细节多了一个part {{name.snakeCase()}}_cubit.freezed.dart;这是 freezed 代码生成产生的文件必须在运行build_runner后才会出现因此在 CI/团队协作中需先执行生成命令再编译初始状态由命名构造CounterState.initial()提供freezed 的 union/sealed 风格让后续扩展多个状态分支如loading、error、loaded变得非常自然例如freezed class CounterState with _$CounterState { const factory CounterState.initial() _Initial; const factory CounterState.value(int count) _Value; }三种风格的选择建议追求最小依赖选 basic需要频繁比较状态是否变化配合BlocBuilder/BlocSelector优化重建选 equatable需要不可变、可模式匹配的多分支状态且团队已接受 build_runner 工作流选 freezed。此建议由 bricks/cubit同样支持三种风格及 packages/flutter_bloc 的公开设计推断得出。六、与 bloc 仓库生态的联动hydrated_cubitBrick 在整个 bloc 仓库中并非孤立的模板理解其上下文有助于正确使用hydrated_bloc包packages/hydrated_bloc提供HydratedCubit基类与存储抽象是生成的代码能运行的运行时前提其示例example与测试test展示了持久化行为如何被验证兄弟 Brickbricks/cubit无持久化的纯 Cubit、bricks/hydrated_bloc持久化 Bloc、bricks/replay_cubit/bricks/replay_bloc可回放状态流、bricks/flutter_bloc_feature面向 Flutter 的完整 feature 脚手架。它们共享namestyle的变量设计学习hydrated_cubit后可以零成本迁移到其他 Brickhooks 机制pre_gen.dart是 Mason 的生成前钩子pubspec.yamlhooks/pubspec.yaml声明了 hooks 自身的依赖与 SDK 约束这与 0.3.0 中「升级 hooks 到 dart ^3.5.4」的变更相互印证。七、常见问题与最佳实践为什么toJson返回MapString, dynamic而不是直接存对象因为HydratedCubit的存储层默认基于本地文件/存储抽象以 JSON 可序列化的 Map 为持久化单元。返回 null 时表示该状态不需持久化例如某些瞬时状态可以跳过存储。part与part of必须配对Cubit 文件中part xxx_state.dart;状态文件中part of xxx_cubit.dart;。文件名由snakeCase()统一派生这正是 0.1.3 版本修复的重点改动文件名时务必保持两者一致。freezed 风格编译报错找不到freezed.dart需要先运行代码生成dart run build_runner build建议将其纳入 CI 流程。持久化不生效的排查路径确认HydratedBloc.storage已在main()中初始化参考hydrated_bloc包文档确认状态类字段都已纳入toJson/fromJson确认使用了HydratedCubit而不是普通Cubit。多文件生成的命名一致性所有模板文件都基于同一个name变量通过snakeCase()/pascalCase()派生文件名与类名因此只要name取规范的小驼峰/小写下划线形式生成的文件与类即可保证互相匹配。八、小结bricks/hydrated_cubit是一个「小而精」的官方 Brick两条变量name、style、两个输出文件、三种代码风格再叠加HydratedCubit的持久化语义与pre_genhook 的分流逻辑构成了 bloc 仓库中可持久化 Cubit 的标准生成入口。从 CHANGELOG.md 的演进可以看到它的成熟路径而从 brick.yaml 与brick模板则能完整复现它的工作机制。若你想进一步定制如增加新的风格、补充默认的 JSON 序列化实现以本 Brick 为起点修改是成本最低的路径。赞分享前端【免费下载链接】blocA predictable state management library that helps implement the BLoC design pattern项目地址https://gitcode.com/gh_mirrors/bl/bloc点击查看免费下载相关推荐霞鹜文楷免费商用楷体中文字体完整指南3 分钟装好霞鹜文楷免费商用楷体中文字体完整指南3 分钟装好 霞鹜文楷是一款基于 FONTWORKS Klee One 衍生的开源楷体中文字体覆盖简繁日汉字 2 万余前端Cult Directory Template认证配置避坑指南邮件确认与SMTP速率限制详解Cult Directory Template认证配置避坑指南邮件确认与SMTP速率限制详解 Cult Directory Template 是一款基于 Ne如何用city-roads一键生成城市道路艺术地图完整可视化指南如何用city roads一键生成城市道路艺术地图完整可视化指南 你是否曾想过将城市的脉络以艺术化的方式呈现传统的城市道路可视化工具往往复杂难用而city前端数据可视化3D渲染创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关推荐

vcluster 依赖解析:go-restful v3 变更历史全解读——从路由匹配优化到 CORS 安全修复
vcluster 依赖解析:go-restful v3 变更历史全解读——从路由匹配优化到 CORS 安全修复

vcluster 依赖解析:go-restful v3 变更历史全解读——从路由匹配优化到 CORS 安全修复 【免费下载链接】vcluster vCluster creates tenant clusters: fully isolated environments delivered as managed Kubernetes, or as the foundation for Slurm, Ray, Run:ai … · 2026/9/23 14:03:19

ps灯光怎么做避坑指南:5个致命错误与源码解析
ps灯光怎么做避坑指南:5个致命错误与源码解析

ps灯光怎么做避坑指南:5个致命错误与源码解析 刚把旧项目的渲染脚本升级到最新引擎,结果一跑全炸了?报错信息全是看不懂的堆栈,API 名字全变了,文档还跟代码对不上。这种崩溃感我太熟了。… · 2026/9/23 14:03:19

S3C2410平台ARM Linux SD/MMC驱动源码解析与移植实战
S3C2410平台ARM Linux SD/MMC驱动源码解析与移植实战

简介:针对ARM架构Linux系统的CF卡与SD卡驱动源码包,面向嵌入式驱动开发、系统集成及视频解码场景的研发人员,用于解决Linux下CF/SD存储设备识别失败、块设备读写异常、协议适配不兼容等问题。压缩包内共8个文件,包含5个C源码、2个… · 2026/9/23 14:03:12

富士X-T5中文手册高效查阅指南:从PDF到可检索参数体系
富士X-T5中文手册高效查阅指南:从PDF到可检索参数体系

简介:《FUJIFILM富士X-T5系列中文手册》是面向富士X-T5无反相机用户的操作指南,适合刚入手新机的新手快速上手,也为进阶摄影师提供深入的技术参考。手册从相机部件讲起,逐一说明对焦棒、快门速度与感光度拨盘、STILL/MOVIE模式拨盘… · 2026/9/23 14:54:35

财管综述炸雷[特殊字符]财务指标、模型公式堆砌,盲审模板重到离谱!
财管综述炸雷[特殊字符]财务指标、模型公式堆砌,盲审模板重到离谱!

财务管理、公司理财、企业绩效分析、投融资管理方向的同学全员破防! 财务管理文献综述,是经管类最容易“公式模板同质化、指标解读千篇一律”的重灾区! 综述高频覆盖:杜邦分析体系、企业盈利能力、偿债能力、营运能力、投融资决… · 2026/9/23 14:54:35

物流管理文献综述可展开的 6 大核心角度(适配本科 / 硕士毕业论文,避开单纯堆砌案例、复述模型的通病)
物流管理文献综述可展开的 6 大核心角度(适配本科 / 硕士毕业论文,避开单纯堆砌案例、复述模型的通病)

梳理供应链、物流相关理论 / 模型的起源、发展迭代、学界争议。 - 示例:EOQ 库存模型、VRP 车辆路径、SCOR 供应链运作参考模型、供应链韧性理论。 - 写作重点:**不是抄公式**,而是对比不同学者对模型假设条件的修正、原有模型缺陷、不同场景… · 2026/9/23 14:54:35

5步搞定前任约见面是什么心态项目最佳实践
5步搞定前任约见面是什么心态项目最佳实践

5步搞定前任约见面是什么心态项目最佳实践 看了一堆教程还是不会写项目?别急,这不是你笨,是没人告诉你 最佳实践 到底长什么样。今天这篇《前任约见面是什么心态》实战教程,直接带你从0到1搭建一个可运行的Web应用。 项目目标… · 2026/9/23 14:54:35

Photopea评测:免费在线PS工具,浏览器中轻松编辑PSD文件
Photopea评测:免费在线PS工具,浏览器中轻松编辑PSD文件

最近逛技术社区的时候,高频刷到一个帖子,标题就一行字:"推荐一个网站,太强了。。"说真的,第一眼我觉得就是标题党,这年头网上推荐帖满天飞,谁都会说"太强了"。但点进评论区… · 2026/9/23 14:54:28

JSP+SSH+MVC商城源码解析:从分层架构到部署避坑指南
JSP+SSH+MVC商城源码解析:从分层架构到部署避坑指南

简介:这是一个面向Java Web初学者的水果销售商城系统完整源码包,基于SSH框架与MVC分层设计,涵盖普通用户注册登录、商品分类浏览、购物车下单、订单查询及管理员端的水果增删改查、分类/订单/用户管理等核心业务模块,很适合用做课… · 2026/9/23 14:54:28

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码