widget-refactor
스타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 페이지를 검토하고 설치를 진행할 수 있습니다.
GitHub Release 发布操作规范。在需要发布版本、上传安装包到 GitHub Release 时激活,确保使用正确的命令和流程。
确认/删除等交互弹框统一使用 showTolyPopPicker 底部弹出样式。在需要弹出确认框、删除确认、操作选择时激活,确保交互风格一致。
后端服务启动与数据库操作规范。在需要启动后端服务、运行 API 测试、执行数据库迁移或遇到连接错误时激活,确保使用正确的命令和流程。
功能归档规范。在归档功能版本、更新功能网、创建存档快照时激活,确保节点编号正确、网络图完整。
使用 tolyui_mediax 实现媒体预览。适用于图片九宫格展示、全屏预览、手势缩放、视频播放、Hero 动画等场景。
Flutter Widget/Page 组件代码评审技能。在需要审查组件代码质量、发现设计问题时激活,确保输出结构化的问题清单和改进建议。
SOC 직업 분류 기준
| name | widget-refactor |
| description | Flutter Widget/Page 组件重构执行技能。在需要对组件执行拆分、提取、简化时激活,确保按正确手法重构并验证通过。 |
| metadata | {"model":"manual","last_modified":"Sun, 14 Jun 2026 00:00:00 GMT"} |
widget-code-review 评审| 手法 | 时机 | 产出 |
|---|---|---|
| 提取独立 Widget 文件 | 30+ 行可独立构建的 UI 片段 | xxx_widget.dart |
| 提取 Scope Widget | 有独立数据订阅(context.select)的 UI 区域 | xxx_scope.dart |
| 提取 Handler | 事件处理逻辑超过 3 行,且不操作 State | handler/xxx_handler.dart |
| 提取 Cubit | View 层持有的业务状态 + WS/Stream 监听 | logic/xxx_cubit.dart |
| 提取值对象 | 3+ 个总是一起传递的参数 | xxx_config.dart 或同文件 class |
| 提取 Extension | 重复出现的转换/判断逻辑 | data/xxx_ext.dart |
| 手法 | 时机 | 效果 |
|---|---|---|
| 事件总线替代 try-catch 包裹 | View 层每个调用都套 try-catch toast | 删除包裹函数,Cubit 内 emit 事件 |
| getter 替代重复条件 | 同一条件在 3+ 处出现 | 一处定义,多处 _isXxx |
| 方法引用替代内联闭包 | 回调逻辑 > 1 行 | onTap: _doSomething |
| 删除纯委托方法 | 方法只调用另一个方法 | 直接传目标方法引用 |
| WS 监听改命名方法 | listen 中的匿名闭包 | .listen(_onXxx) |
| Cubit getter 暴露派生值 | 外部每次从 state 手动判断 | cubit.notice、cubit.pinnedMessages |
| 手法 | 时机 |
|---|---|
| 按功能建子文件夹 | 同一功能域 2+ 个文件(如 pinned/、notice/、menu/) |
页面骨架放 index/ | 使 view 根目录全是文件夹,无散落文件 |
| 相关组件就近放 | 强相关组件放同一目录(如 skeleton、empty 放 index/) |
dart analyze lib 零错误docs/project/checkup/{版本}/client/{序号}_{文件名}_refactor_summary.mdChatTarget(跟谁聊) vs ChatViewOptions(怎么显示)ChatPageConfig 混装身份+UI+状态+回调ChatTarget、ChatViewOptions,不要 ChatPageConfigurationOptionscontext.select 精确订阅,只在相关数据变化时重建context.select((ChatGroupCubit c) => c.notice)BuildContext(需要导航时)和业务参数重构完成后,给主类加文档注释(参考 Flutter 源码风格):
/// 聊天主页面。
///
/// 负责组装聊天相关的各个 UI 区域,自身不持有业务状态。
///
/// ## 页面结构
///
/// ```
/// ┌─────────────────────────────┐
/// │ ChatAppBar │
/// ├─────────────────────────────┤
/// │ NoticeBanner (群聊) │
/// ├─────────────────────────────┤
/// │ MessageList │
/// ├─────────────────────────────┤
/// │ InputSection / DisbandBar │
/// └─────────────────────────────┘
/// ```
///
/// ## 状态来源
///
/// - [ChatCubit] — 消息列表、发送、多选
/// - [ChatGroupCubit] — 群组信息(仅群聊)
/// - [PeerStatusCubit] — 对端在线状态(仅单聊)
///
/// ## 事件委托
///
/// - [ChatMediaHandler] — 媒体打开与下载
/// - [ChatMenuHandler] — 菜单事件分发
class ChatPage extends StatefulWidget {
dart analyze 验证)flash_im_chat.dart)同步更新 export 路径context.select 只能在 Widget 的 build 方法中直接调用,不能在 BlocBuilder 的 builder 回调中嵌套使用——后者用 context.read 取快照Set-Content 会破坏 UTF-8 中文编码,文件写入必须用 fs_write 工具或 [System.IO.File]::WriteAllText + UTF8 编码Map<String, dynamic> — 加载时一次性解析,消除后续所有 as String?ShowToastEvent 事件总线替代,操作方法只需 emit 不需 catch