使用 Mason 的 cubit Brick 快速生成 Cubit配置变量、三种风格与代码模板深度解析【免费下载链接】blocA predictable state management library that helps implement the BLoC design pattern项目地址: https://gitcode.com/gh_mirrors/bl/bloc本指南以 bloc 仓库中 bricks/cubit 这一官方 Mason Brick 为讲解对象说明如何用一条mason make命令在任意 Dart 项目中生成结构完整的 Cubit 代码骨架cubit 类 state 类。读完本文你将掌握name/style两个变量的取值规则与默认值、basic / equatable / freezed 三种生成风格的差异与适用场景并能结合模板源码理解每条命令实际产出的代码长什么样。一、cubit Brick 是什么Cubit 是 bloc 状态管理库中基于Stream与State的精简实现它没有事件层只有公开方法驱动状态变更适合状态变化简单、不需要复杂事件流编排的场景。为了让开发者快速起手bloc 仓库在bricks/cubit目录下维护了一个官方 Mason Brick其 brick.yaml 中写明name: cubit description: Generate a new Cubit in Dart. Built for the bloc state management library. version: 0.3.0该 Brick 的作用是在目标 Dart 项目中一次性生成「cubit 类 state 类」两个文件且通过style变量支持三种代码风格从零配置到强类型约束自由切换。二、安装与基本用法使用该 Brick 的前提是本机已安装 mason_clibrick.yaml 中声明依赖mason: ^0.1.0。cubit Brick 本身随 bloc 仓库分发你可以将仓库中的bricks/cubit目录作为本地 Brick 使用也可以将其发布为 Mason 注册表上的 brick 后按名称拉取。在目标项目目录下执行生成命令mason make cubit --name counter --style basic执行后当前目录会出现如下输出结构即 README 中的 Output 章节├── counter_cubit.dart └── counter_state.dart也就是说一次生成恰好产出两个文件以name的 snake_case 命名的 cubit 文件与 state 文件。若不带任何参数直接运行mason make cubitMason 会按变量的prompt依次交互式询问 cubit 名称与风格见 brick.yaml 中的prompt: Please enter the cubit name.与prompt: What is the cubit style?。三、变量Variables详解README 中给出的变量表如下VariableDescriptionDefaultTypenameThe name of the cubit classcounterstringstyleThe style of cubit generatedbasic (basic, equatable, freezed)enum结合 brick.yaml 的vars定义可以补充两点实现细节name为string类型默认值counter。模板中会通过 Mason 的辅助方法把原始输入转换为不同命名风格{{name.snakeCase()}}用于生成文件名与part指令{{name.pascalCase()}}用于生成类名。例如输入counter会生成CounterCubit/CounterState输入user login之类的复合名则会按 snake_case / pascal_case 自动规范化。style为enum类型默认值basic允许取值恰好三个basic、equatable、freezed。它是本 Brick 最关键的分支变量决定了最终生成代码的形态。四、三种风格style的代码模板分析style的分支逻辑由 hooks/pre_gen.dart 在生成前执行import package:mason/mason.dart; Futurevoid run(HookContext context) async { final style context.vars[style]; context.vars { ...context.vars, use_basic: style basic, use_equatable: style equatable, use_freezed: style freezed, }; }Hook 会把用户选择的style转换为三个布尔开关use_basic/use_equatable/use_freezed而 {{name.snakeCase()}}_cubit.dart}}_cubit.dart) 与 {{name.snakeCase()}}_state.dart}}_state.dart) 这两个入口模板则用 Mason 的{{#use_xxx}}{{ xxx }}{{/use_xxx}}条件块 partial 语法按开关分别渲染对应的 partial 片段。这也解释了为什么每个 Brick 目录里同时存在多组{{~ basic_* }}、{{~ equatable_* }}、{{~ freezed_* }}文件。4.1 basic零依赖的最小骨架--style basic生成的 cubit 模板{{~ basic_cubit }}import package:bloc/bloc.dart; part counter_state.dart; class CounterCubit extends CubitCounterState { CounterCubit() : super(const CounterState()); }对应的 state 模板{{~ basic_state }}part of counter_cubit.dart; class CounterState { const CounterState(); }要点cubit 通过part counter_state.dart与 state 文件关联state 文件以part of反向引入二者构成一个整体编译单元CounterCubit extends CubitCounterState构造函数以const CounterState()作为初始状态除package:bloc/bloc.dart外不引入任何额外依赖是最轻量的选择。此时CounterState是普通 class不具备值相等性equality状态比较需自行实现或依赖identical。4.2 equatable开箱即用的值相等性--style equatable生成的 cubit 模板{{~ equatable_cubit }}import package:bloc/bloc.dart; import package:equatable/equatable.dart; part counter_state.dart; class CounterCubit extends CubitCounterState { CounterCubit() : super(const CounterState()); }对应的 state 模板{{~ equatable_state }}part of counter_cubit.dart; class CounterState extends Equatable { const CounterState(); override ListObject get props []; }要点引入package:equatable/equatable.dartCounterState继承Equatable并覆写props生成时props为空列表当你为状态添加字段时需要手动把字段加入props例如ListObject get props [count];从而获得基于字段值的/hashCode这一风格对 Cubit 尤其重要Cubit 内部会基于状态值判断新旧状态是否相等若相等则不会触发新的状态流发射避免多余的重建与通知。选择 equatable 风格可以让你后续自然受益于这一去重机制。4.3 freezed强类型不可变状态--style freezed生成的 cubit 模板{{~ freezed_cubit }}import package:bloc/bloc.dart; import package:freezed_annotation/freezed_annotation.dart; part counter_state.dart; part counter_cubit.freezed.dart; class CounterCubit extends CubitCounterState { CounterCubit() : super(const CounterState.initial()); }对应的 state 模板{{~ freezed_state }}part of counter_cubit.dart; freezed class CounterState with _$CounterState { const factory CounterState.initial() _Initial; }要点引入package:freezed_annotation/freezed_annotation.dart并声明part counter_cubit.freezed.dart占位生成文件state 使用freezed注解配合with _$CounterStatemixin通过const factory CounterState.initial() _Initial;定义一个名为initial的具名构造器相应地cubit 的初始状态改为super(const CounterState.initial())使用该风格需要在项目中额外配置 build_runner / freezed 代码生成流程生成counter_cubit.freezed.dart后才能编译通过。它适合状态结构复杂、需要 union/sealed 语义、copyWith 与序列化支持的重型场景。五、生成结果对比与选择建议以namecounter为例三种风格在「初始状态写法」上的差异最直观style初始状态写法额外依赖适用场景basicsuper(const CounterState())无快速原型、状态极简equatablesuper(const CounterState())equatable需要值相等去重、中小型状态freezedsuper(const CounterState.initial())freezed_annotation build_runner复杂不可变状态、需要 codegen从实现上看三种风格的 cubit 类本体几乎一致都extends CubitState差异集中在 state 类的定义方式与初始状态的构造写法上。因此可以先以basic起步跑通链路再视状态复杂度平滑升级为equatable或引入 build_runner 切换到freezed。六、延伸仓库中的同族 Brickcubit Brick 并非孤例。在 bricks 目录下bloc 仓库还提供了同构的 bloc、hydrated_cubit、hydrated_bloc、replay_cubit、replay_bloc 等 Brick以及面向 Flutter 页面的 flutter_bloc_feature额外生成 bloc provider / builder 组件。这些 Brick 的name/style变量语义与 cubit 完全一致理解本文的模板组织方式后你即可触类旁通地阅读其余 Brick 的__brick__与hooks/pre_gen.dart。七、小结cubit Brick 通过一条命令产出*_cubit.dart与*_state.dart两个文件变量仅name默认counter与style默认basic可选equatable、freezedhooks/pre_gen.dart将style翻译成三个布尔开关由入口模板的条件块选择对应 partial 渲染三种风格的核心差异在 state 类的定义方式与初始状态写法选择时应结合是否需要值相等、是否接受 build_runner codegen 来权衡该 Brick 的完整可运行模板均可直接参考 bricks/cubit/brick目录下的实际源码按需复制改造。【免费下载链接】blocA predictable state management library that helps implement the BLoC design pattern项目地址: https://gitcode.com/gh_mirrors/bl/bloc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
手写HTML+CSS问卷表单:掌握原生表单语义与校验机制 简介:这是一份面向前端初学者与HTML/CSS练习者的网页仿写实战资源,聚焦问卷星个人版核心界面的静态实现,帮助开发者掌握结构语义化、响应式布局及交互元素样式设计。资源共4个文件,包含1个主入口HTML文件(组织页面骨架… · 2026/9/23 7:07:46
磨耳朵英语保姆级教程:3步搞定底层原理 磨耳朵英语保姆级教程:3步搞定底层原理 看了一堆教程还是不会写项目?别慌,这很正常。 很多开发者卡在“懂原理”和“能落地”之间,就像学开车只看视频不下场。 今天这篇保姆级教程,不聊虚的,直接拆解“磨耳朵英语”背后的技术逻辑。… · 2026/9/23 7:07:46
Atlas 300V推理卡部署YOLOv5全流程实战 Atlas这个词,近一年在我耳边出现的频率高得离谱。不管刷技术社区还是看工作群,总有人提"atlas跑YOLO""atlas部署推理",我一度以为是什么新出的开源框架,直到我面前摆了一张华为Atlas 300V 24G运算加速卡&… · 2026/9/23 8:34:51
2026年五大AI降本增效工具实测与选型指南 1. 项目概述最近两年AI技术在各行各业的渗透率持续攀升,随之而来的是企业对AI应用成本控制的强烈需求。作为一名长期关注AI工具落地的技术顾问,我实测了市面上主流的AI降本增效工具,发现2026年这五大工具在实际业务场景中的表现尤为突出。2. … · 2026/9/23 8:34:45
声发射上升时间计算详解:从波形特征提取到b值分析应用 简介:这个MATLAB脚本围绕声发射(AE)信号的时域特征参数量身打造,适合从事材料无损检测、结构健康监测以及声信号处理研究的工程师、科研人员和相关专业学生参考与复用。压缩包内仅含1个m文件,大小约2KB,代码… · 2026/9/23 8:34:38
期望搜索实战:用Expectimax实现爱因斯坦棋AI 简介:一套基于期望搜索算法的爱因斯坦棋博弈软件,面向计算机博弈大赛参赛者、棋类爱好者及高校师生。项目以Python编写,通过期望搜索分析棋局并制定策略,同时提供实时反馈与多种棋类支持,兼顾对弈和教学用途。 压缩包… · 2026/9/23 8:34:38
DeepSeek V4.1 Flash缓存机制与成本优化实践 1. 这次降价不是“挤牙膏”,而是模型服务定价逻辑的实质性松动最近在几个技术群和开发者论坛里,DeepSeek V4.1 Flash这个新版本被反复提起,标题里那句“缓存命中价降至0.02/M”像一颗小石子,激起了不小涟漪。我第一时间拉了团队做… · 2026/9/23 8:34:38
3招搞定手机怎么下载微信面试难题实战项目解析 3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29