widget-code-review
星标12
分支2
更新时间2026年6月14日 13:59
Flutter Widget/Page 组件代码评审技能。在需要审查组件代码质量、发现设计问题时激活,确保输出结构化的问题清单和改进建议。
安装
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
SKILL.md
readonly菜单
Flutter Widget/Page 组件代码评审技能。在需要审查组件代码质量、发现设计问题时激活,确保输出结构化的问题清单和改进建议。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
GitHub Release 发布操作规范。在需要发布版本、上传安装包到 GitHub Release 时激活,确保使用正确的命令和流程。
确认/删除等交互弹框统一使用 showTolyPopPicker 底部弹出样式。在需要弹出确认框、删除确认、操作选择时激活,确保交互风格一致。
后端服务启动与数据库操作规范。在需要启动后端服务、运行 API 测试、执行数据库迁移或遇到连接错误时激活,确保使用正确的命令和流程。
功能归档规范。在归档功能版本、更新功能网、创建存档快照时激活,确保节点编号正确、网络图完整。
使用 tolyui_mediax 实现媒体预览。适用于图片九宫格展示、全屏预览、手势缩放、视频播放、Hero 动画等场景。
Flutter Widget/Page 组件重构执行技能。在需要对组件执行拆分、提取、简化时激活,确保按正确手法重构并验证通过。
| name | widget-code-review |
| description | Flutter Widget/Page 组件代码评审技能。在需要审查组件代码质量、发现设计问题时激活,确保输出结构化的问题清单和改进建议。 |
| metadata | {"model":"manual","last_modified":"Sun, 14 Jun 2026 00:00:00 GMT"} |
widget-refactor 技能| 检查项 | 标准 | 坏味道 |
|---|---|---|
| 文件行数 | ≤ 500 行 | 超过 600 行的 God Widget |
| build 方法行数 | ≤ 40 行 | 超过 60 行的巨型 build |
| 最大缩进层级 | ≤ 6 层 | 8 层以上的嵌套地狱 |
| 方法数量 | ≤ 15 个 | 职责不单一的信号 |
| 检查项 | 期望 | 坏味道 |
|---|---|---|
| 骨架一屏可见 | build 只做 UI 拼接,一屏能看完结构 | 需要滚动 3 屏才看完 |
| 内联闭包 | 事件处理 ≤ 1 行(方法引用) | 超过 3 行的匿名闭包硬嵌在构建树中 |
| 条件分支 | 用 getter 或三元表达式 | 大段 if-else 块打断构建流 |
| 重复参数 | 同组参数只出现一次 | 两个相似组件重复传 8+ 相同参数 |
| 组件分离 | 可独立构建的小零件,独立出文件;按功能建文件夹收录 | 30+ 行的 UI 片段内联在 build 中 |
| 注释 | 类顶部 /// 文档注释,方法体内不写注释 | 代码里散落说明性注释 |
| 检查项 | 期望 | 坏味道 |
|---|---|---|
| HTTP 请求 | 在 Repository / Cubit 层 | View 层直接 dio.get(...) |
| JSON 解析 | 在 data 层 | View/State 中 jsonDecode(...) |
| WS 监听 | 在 Cubit 中管理(自动 cancel) | View 层持有 StreamSubscription |
| 业务判断 | 在 logic 层或 handler | View 中写 switch/if 业务分支 |
| 状态修改 | 通过 Cubit emit | View 层 setState 管理业务状态 |
| 错误提示 | 通过事件总线或 State 反馈 | View 层 try-catch 包裹每个调用 |
| 检查项 | 期望 | 坏味道 |
|---|---|---|
| 方法命名 | 动词开头,表达意图 | _safeSend、_handle1、_do |
| 参数分组 | 3+ 个总是一起传递的参数 → 值对象 | 10+ 散装参数的构造函数 |
| 值对象边界 | 按语义分组,不是一股脑塞进一个 Config | 一个大 Config 混装身份+UI+状态 |
| 缩写 | 只在极小作用域使用 | 类级 getter 用 _t、_c、_opts |
| 中转方法 | 不存在(直接用目标方法) | _handleX() { _doX(); } 纯委托 |
| 重复逻辑 | 用 extension 封装 | 三元嵌套判断类型摘要 |
| 检查项 | 期望 | 坏味道 |
|---|---|---|
| 数据订阅 | context.select 精确订阅 | 整个 BlocBuilder 监听全量 State |
| 状态归属 | 每组状态有独立 Cubit | 一个 God Cubit 管所有 + View 还存一份 |
| Cubit getter | 常用派生值暴露 getter | 外部每次从 state 手动计算 |
| 独立 Scope Widget | 有独立重建边界的 UI 块封装为 Widget | BlocBuilder 嵌套在 build 中 |
| 检查项 | 期望 | 坏味道 |
|---|---|---|
| Subscription | Cubit 管理,View 不持有 | View 层 listen + dispose cancel |
| BuildContext | async 后必检 mounted | await ... Navigator.push 无守卫 |
| const 优化 | 纯展示 Widget 可 const | 每次 build 重建不变的 Widget |
| 重复计算 | 昂贵计算缓存或提升 | itemBuilder 中每次 jsonDecode |
评审结果输出为文档文件,路径:docs/project/checkup/{版本}/client/{序号}_{文件名}_review.md
# {文件名} 代码评审
当前行数:{N} 行(有效代码 {M} 行)
## 问题清单
| # | 维度 | 问题描述 | 严重度 | 建议 |
|---|------|---------|--------|------|
| 1 | 结构 | build 方法 120 行 | P0 | 拆为子方法 |
| 2 | 可读性 | onSendVideo 回调内联 10 行 | P1 | 提取为命名方法 |
| ... | | | | |
## 改进方向(概要)
- P0:...
- P1:...
| 级别 | 含义 | 标准 |
|---|---|---|
| P0 | 必须修 | 严重影响可读性/可维护性,阻碍后续开发 |
| P1 | 应该修 | 违反分层/重复代码/命名混乱,但不阻塞 |
| P2 | 可以修 | 风格优化、微调,有空再改 |