# ChatFloatingIcon 和 ChatPopup 组件说明 这两个组件用于替代原来的 `FloatingIcon`,解决了在 Stack 中会被上层遮挡的问题。 ## 组件结构 ### ChatFloatingIcon 可拖拽的悬浮图标组件,支持: - 自定义图标和大小 - 拖拽功能(自动吸附屏幕边缘) - 长按开始语音输入 - 点击进入全屏聊天 - 多种动画效果 ### ChatPopup 基于 Overlay 的弹窗容器,负责: - 管理 PartScreen 的显示/隐藏 - 根据图标位置自动计算弹窗位置 - 处理背景点击关闭 - 动画效果管理 ## 使用方法 ### 基本使用(默认AI图标) ```dart ChatPopup( child: ChatFloatingIcon( iconSize: 80, // 可选,默认80 ), ), ``` ### 自定义图标 ```dart ChatPopup( child: ChatFloatingIcon( iconSize: 60, icon: Container( width: 60, height: 60, decoration: const BoxDecoration( color: Colors.blue, shape: BoxShape.circle, ), child: const Icon(Icons.chat, color: Colors.white), ), ), ), ``` ### 添加自定义回调 ```dart ChatPopup( child: ChatFloatingIcon( iconSize: 70, onTap: () { // 自定义点击事件 }, onPositionChanged: (position) { // 位置变化回调 }, onDragStart: () { // 拖拽开始 }, onDragEnd: () { // 拖拽结束 }, ), ), ``` ## 参数说明 ### ChatFloatingIcon 参数 - `iconSize`: 图标大小,默认80 - `icon`: 自定义图标Widget,不传则使用默认AI图标 - `onTap`: 点击回调,默认进入全屏聊天 - `onLongPress`: 长按开始回调,默认开始语音输入 - `onLongPressUp`: 长按结束回调,默认结束语音输入 - `onLongPressEnd`: 长按结束详细回调 - `onDragStart`: 拖拽开始回调 - `onDragEnd`: 拖拽结束回调 - `onPositionChanged`: 位置变化回调 ### ChatPopup 参数 - `child`: 子组件,通常是ChatFloatingIcon - `chatSize`: 聊天框大小,默认320x450 ## 功能特性 1. **避免遮挡**: 使用 Overlay 显示弹窗,不会被 Stack 上层遮挡 2. **位置自适应**: 根据图标位置自动计算弹窗显示位置 3. **保持原有逻辑**: 与原 FloatingIcon 功能完全兼容 4. **灵活自定义**: 支持自定义图标、回调等 5. **动画丰富**: 保持原有的各种动画效果 ## 迁移指南 ### 从 FloatingIcon 迁移 原来的代码: ```dart Stack( children: [ // 其他内容 FloatingIcon(), ], ) ``` 新的代码: ```dart Stack( children: [ // 其他内容 ChatPopup( child: ChatFloatingIcon(), ), ], ) ``` ## 注意事项 1. ChatPopup 必须在有 Overlay 的 Widget 树中使用(通常是 MaterialApp 下) 2. 如果要自定义图标,建议保持圆形设计以匹配拖拽动画 3. 长按语音输入功能需要 MessageService 正确配置 4. 位置计算基于屏幕坐标,确保在正确的上下文中使用