Files
social-app/docs/plans/2026-03-12-home-composer-redesign-design.md
T
qzl 01c36eb32e refactor: 移除前端 Mock API,新增共享组件,优化认证流程
- 删除 mock_api_client、mock_calendar_service、mock_history_service
- 新增 fixed_length_code_input、link_button、message_composer 共享组件
- 优化登录/注册/密码重置页面使用新组件
- 简化 injection.dart 移除 mock 分支
- 更新 env.dart 配置(BACKEND_URL 替换 API_URL)
- 后端 agentscope 工具和测试更新
- 重构 AGENTS.md 文档结构
- 新增 deploy/ 目录和 protocol 文档
2026-03-12 16:41:45 +08:00

123 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Home 输入组件重做设计(HomeComposer Redesign
## 1. 目标与范围
### 1.1 目标
- 解决当前输入组件“质感弱、结构割裂、录音时布局漂移”的问题。
- 统一 `+` 按钮、输入区、右侧动作图标到一个圆角矩形主容器内。
- 保留并复用现有录音、转写、自动发送、停止生成、Toast 错误处理逻辑。
### 1.2 非目标
- 不改动聊天流、消息发送后端协议、语音识别接口。
- 不改动 `+` 按钮业务行为。
- 不新增独立的页面级浮层录音面板。
## 2. 问题诊断(现状)
- 当前输入区由多个分离容器拼接,视觉上像“纸片贴上去”。
- 输入框本体和右侧图标视觉上未合为一个整体容器。
- “按住说话”提示与录音动画在主布局外追加,录音时造成结构上下跳动。
## 3. 方案对比
### 方案 A:单容器双模式(推荐)
- 单一胶囊主容器承载三段:左操作、中间主内容、右操作。
- 中间区域在文本模式与按住说话模式之间替换(`AnimatedSwitcher`)。
- 录音动画仅在中间区域内部切换显示,不改变主容器高度。
优点:结构稳定、状态清晰、维护成本低。
缺点:视觉表达自由度略低于 Overlay 方案。
### 方案 B:双容器交叉切换
- 文本容器和语音容器完整分离,做交叉淡入。
优点:切换动效可做得更明显。
缺点:状态同步复杂,容易再次出现错位与边界问题。
### 方案 COverlay 浮层
- 保持输入容器不变,录音时叠加浮层。
优点:动画自由度高。
缺点:与“整块替换”诉求不一致,事件命中与无障碍处理更复杂。
结论:采用方案 A。
## 4. 信息架构与组件边界
## 4.1 新组件
- 新建 `HomeComposer`(从 `home_screen.dart` 抽离输入区渲染职责)。
- `HomeScreen` 继续持有业务状态与行为方法,`HomeComposer` 负责展示与手势分发。
## 4.2 主容器结构
- 一个圆角矩形主容器(轻拟物胶囊风格)。
- 左侧:`+` 按钮(行为不变)。
- 中间:
- 文本模式:无边框输入区(文字垂直居中)。
- 语音模式:按住说话按钮区。
- 录音中/识别中:在语音模式内部替换状态内容。
- 右侧:动作图标(声波/键盘/发送/停止)。
## 5. 状态机设计
## 5.1 状态定义
- 模式层:`text` / `holdToSpeak`
- 过程层:`idle` / `recording` / `transcribing`
## 5.2 核心约束
- 主容器高度固定,状态变化不得引发外层布局高度变化。
- `recording` 时禁止模式切换,避免状态错位。
## 5.3 右侧图标决策
- Agent 等待中:停止图标。
- 非等待:
- 有文本:发送图标。
- 无文本且 `text``LucideIcons.activity`
- 无文本且 `holdToSpeak``LucideIcons.keyboard`
## 6. 交互与动画
## 6.1 长按语音流程
1. `onLongPressStart`:触发 `HapticFeedback.lightImpact()`,开始录音。
2. `onLongPressMoveUpdate`:上滑超过阈值,取消录音。
3. `onLongPressEnd`:未取消则停止录音,转写并自动发送。
## 6.2 提示文案显示策略
- “松开发送,上滑取消”仅在 `recording` 显示。
- 空闲按住说话模式不显示该提示。
## 6.3 动画策略
- 模式切换:短时 `AnimatedSwitcher`(淡入/轻位移)。
- 录音波形:仅在 `recording` 驱动;停止后立刻回收。
- 动画渲染在中间区域内部,不新增外部占位。
## 7. 视觉规范(Design Tokens
- 严格使用 `apps/lib/core/theme/design_tokens.dart` 中的 `AppColors``AppSpacing``AppRadius`
- 禁止硬编码颜色、间距、圆角、尺寸、阴影。
- 主容器采用白色底 + 细边 + 柔和阴影,形成轻拟物层次。
- 输入区内部无额外边框,确保文字垂直居中和图标视觉对齐。
## 8. 验收标准
- 图标与输入区在同一圆角矩形中,不再分离。
- 录音全流程不出现输入组件上移、下坠或高度抖动。
- 提示文案仅在实际录音中显示。
- 文本/语音模式切换平滑;`+` 与发送逻辑行为保持一致。
## 9. 风险与缓解
- 风险:重构过程中影响现有发送/停止生成分支。
- 缓解:优先复用原有行为方法,仅调整 UI 结构与状态映射。
- 风险:手势与模式切换并发导致状态错乱。
- 缓解:录音期间加切换锁,结束后释放。
## 10. 验证计划
- 手工验证:
- 文本发送、停止生成、`+` 弹层、语音长按录音、上滑取消、自动发送。
- 文本模式与语音模式往返切换稳定性。
- Widget 测试(建议新增):
- 右侧图标状态映射测试。
- 录音中提示文案显示条件测试。
- 模式切换时主容器高度恒定测试。