# 首页图片选择功能设计 ## 1. 需求概述 在首页聊天界面的加号按钮弹出的底部面板中,实现拍照和相册选择图片功能: - 最多选择 3 张图片 - 图片预览显示在输入框上方 - 图片可被取消移除 - 点击发送后图片随文本一起发送到后端 ## 2. 技术方案 ### 2.1 依赖 添加 `image_picker: ^1.0.7` 到 `pubspec.yaml` ### 2.2 状态管理 在 `HomeScreen` 中添加图片状态: ```dart List _selectedImages = []; // 最多3张 ``` ### 2.3 图片选择逻辑 修改 `home_sheet.dart`: - `image_picker` 选择图片(最多3张) - 返回选中的 `List` 到 `HomeScreen` ### 2.4 AG-UI 消息格式 修改 `ag_ui_service.dart` 的 `_buildRunInput` 方法,支持多模态消息: ```dart Map _buildRunInput({ required String content, List? images, }) { final threadId = _threadId ?? _newUuid(); final runId = _nextId(_runIdPrefix); // 构建多模态内容块 final contentBlocks = >[]; // 添加文本 if (content.isNotEmpty) { contentBlocks.add({'type': 'text', 'text': content}); } // 添加图片(Base64 编码) for (final image in images ?? []) { final bytes = await image.readAsBytes(); final base64 = base64Encode(bytes); contentBlocks.add({ 'type': 'image', 'source': { 'type': 'base64', 'media_type': 'image/jpeg', 'data': base64, }, }); } return { 'threadId': threadId, 'runId': runId, 'state': {}, 'messages': [ { 'id': _nextId('user_'), 'role': 'user', 'content': contentBlocks.length == 1 ? (contentBlocks[0]['type'] == 'text' ? contentBlocks[0]['text'] : contentBlocks) : contentBlocks, }, ], // ... }; } ``` ## 3. UI 设计 ### 3.1 图片预览区 位置:输入框上方,聊天消息区域下方 ``` ┌─────────────────────────────────────┐ │ 聊天消息区域 │ │ │ ├─────────────────────────────────────┤ │ ┌─────────┐ ┌─────────┐ ┌────────┐│ │ │ ✕ │ │ ✕ │ │ ✕ ││ ← 预览区 │ │ [图片] │ │ [图片] │ │ [图片] ││ │ └─────────┘ └─────────┘ └────────┘│ ├─────────────────────────────────────┤ │ [+] [ 输入消息... ] [发送]│ └─────────────────────────────────────┘ ``` ### 3.2 样式规格 | 元素 | 值 | |------|-----| | 预览卡片尺寸 | 80x80 dp | | 圆角 | `AppRadius.md` (12dp) | | 间距 | `AppSpacing.sm` (8dp) | | 取消按钮 | 24x24 圆形,红色背景,白色 X 图标 | | 边框 | 1dp `AppColors.slate200` | ### 3.3 交互 - 点击加号 → 底部弹出选择面板 - 选择图片 → 预览区显示缩略图 - 点击 X → 移除对应图片 - 输入文本 + 有图片 → 点击发送发送组合消息 ## 4. 文件改动 | 文件 | 改动 | |------|------| | `pubspec.yaml` | 添加 image_picker 依赖 | | `home_sheet.dart` | 实现拍照/相册选择 | | `home_screen.dart` | 添加图片状态、预览区 UI | | `ag_ui_service.dart` | 修改 _buildRunInput 支持多模态 | ## 5. 测试要点 - [ ] 选择 1-3 张图片正常显示 - [ ] 选择超过 3 张时提示或限制 - [ ] 图片可以成功移除 - [ ] 发送消息时图片 Base64 正确编码 - [ ] AG-UI 消息格式符合规范