426 lines
11 KiB
Markdown
426 lines
11 KiB
Markdown
|
|
# AI Chat Assistant Flutter Plugin - 详细代码逻辑文档
|
|||
|
|
|
|||
|
|
## 📋 项目概述
|
|||
|
|
|
|||
|
|
这是一个专为车载系统设计的AI聊天助手Flutter插件,采用插件化架构设计,支持语音识别、AI对话、车控命令执行等功能。项目从原有的App结构重构为Plugin结构,便于集成到其他Flutter应用中。
|
|||
|
|
|
|||
|
|
## 🏗️ 核心架构分析
|
|||
|
|
|
|||
|
|
### 1. 架构模式
|
|||
|
|
|
|||
|
|
- **插件化架构**: 采用Flutter Plugin架构,便于第三方应用集成
|
|||
|
|
- **单例模式**: 核心服务类(MessageService)采用单例模式确保全局状态一致
|
|||
|
|
- **观察者模式**: 基于Provider的状态管理,实现响应式UI更新
|
|||
|
|
- **回调机制**: 通过CommandCallback实现车控命令的解耦处理
|
|||
|
|
|
|||
|
|
### 2. 目录结构与职责
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
lib/
|
|||
|
|
├── app.dart # 插件主入口,提供初始化接口
|
|||
|
|
├── enums/ # 枚举定义层
|
|||
|
|
├── models/ # 数据模型层
|
|||
|
|
├── services/ # 业务逻辑服务层
|
|||
|
|
├── screens/ # UI界面层
|
|||
|
|
├── widgets/ # UI组件层
|
|||
|
|
├── utils/ # 工具类层
|
|||
|
|
└── themes/ # 主题样式层
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 核心枚举定义 (Enums)
|
|||
|
|
|
|||
|
|
### MessageServiceState
|
|||
|
|
```dart
|
|||
|
|
enum MessageServiceState {
|
|||
|
|
idle, // 空闲状态
|
|||
|
|
recording, // 录音中
|
|||
|
|
recognizing, // 识别中
|
|||
|
|
replying, // 回复中
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### MessageStatus
|
|||
|
|
```dart
|
|||
|
|
enum MessageStatus {
|
|||
|
|
normal, // 普通消息
|
|||
|
|
listening, // 聆听中
|
|||
|
|
recognizing, // 识别中
|
|||
|
|
thinking, // 思考中
|
|||
|
|
completed, // 完成回答
|
|||
|
|
executing, // 执行中
|
|||
|
|
success, // 执行成功
|
|||
|
|
failure, // 执行失败
|
|||
|
|
aborted, // 已中止
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### VehicleCommandType
|
|||
|
|
支持22种车控命令类型:
|
|||
|
|
- 车门控制:lock, unlock
|
|||
|
|
- 车窗控制:openWindow, closeWindow
|
|||
|
|
- 空调控制:openAC, closeAC, changeACTemp, coolSharply
|
|||
|
|
- 特殊功能:prepareCar, meltSnow, honk, locateCar
|
|||
|
|
- 加热功能:座椅加热、方向盘加热等
|
|||
|
|
|
|||
|
|
## 📊 数据模型层 (Models)
|
|||
|
|
|
|||
|
|
### ChatMessage
|
|||
|
|
```dart
|
|||
|
|
class ChatMessage {
|
|||
|
|
final String id; // 消息唯一标识
|
|||
|
|
final String text; // 消息内容
|
|||
|
|
final bool isUser; // 是否为用户消息
|
|||
|
|
final DateTime timestamp; // 时间戳
|
|||
|
|
MessageStatus status; // 消息状态
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### VehicleCommand
|
|||
|
|
```dart
|
|||
|
|
class VehicleCommand {
|
|||
|
|
final VehicleCommandType type; // 命令类型
|
|||
|
|
final Map<String, dynamic>? params; // 命令参数
|
|||
|
|
final String error; // 错误信息
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 核心服务层 (Services)
|
|||
|
|
|
|||
|
|
### 1. MessageService - 核心消息管理服务
|
|||
|
|
|
|||
|
|
**设计模式**: 单例模式 + 观察者模式
|
|||
|
|
|
|||
|
|
**主要职责**:
|
|||
|
|
- 统一管理聊天消息
|
|||
|
|
- 协调语音识别、AI对话、车控命令执行流程
|
|||
|
|
- 维护应用状态机
|
|||
|
|
|
|||
|
|
**核心方法分析**:
|
|||
|
|
|
|||
|
|
#### 语音输入流程
|
|||
|
|
```dart
|
|||
|
|
// 开始语音输入
|
|||
|
|
Future<void> startVoiceInput() async {
|
|||
|
|
// 1. 权限检查
|
|||
|
|
// 2. 状态验证
|
|||
|
|
// 3. 初始化录音
|
|||
|
|
// 4. 调用原生ASR服务
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 停止并处理语音输入
|
|||
|
|
Future<void> stopAndProcessVoiceInput() async {
|
|||
|
|
// 1. 停止录音
|
|||
|
|
// 2. 等待ASR结果
|
|||
|
|
// 3. 调用reply()处理识别结果
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 智能回复流程
|
|||
|
|
```dart
|
|||
|
|
Future<void> reply(String text) async {
|
|||
|
|
// 1. 文本分类(TextClassificationService)
|
|||
|
|
// 2. 根据分类结果路由到不同处理逻辑:
|
|||
|
|
// - 车控命令 (category=2) -> handleVehicleControl()
|
|||
|
|
// - 普通问答 (default) -> answerQuestion()
|
|||
|
|
// - 错误问题 (category=4) -> answerWrongQuestion()
|
|||
|
|
// - 系统错误 (category=-1) -> occurError()
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
#### 车控命令处理
|
|||
|
|
```dart
|
|||
|
|
Future<void> handleVehicleControl(String text, bool isChinese) async {
|
|||
|
|
// 1. 调用VehicleCommandService解析命令
|
|||
|
|
// 2. 执行TTS播报
|
|||
|
|
// 3. 逐个执行车控命令
|
|||
|
|
// 4. 处理命令执行结果
|
|||
|
|
// 5. 生成执行反馈
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**状态管理机制**:
|
|||
|
|
- 使用`ChangeNotifier`实现响应式状态更新
|
|||
|
|
- 通过`_state`维护服务状态机
|
|||
|
|
- 使用`_isReplyAborted`实现流程中断控制
|
|||
|
|
|
|||
|
|
### 2. CommandService - 车控命令处理服务
|
|||
|
|
|
|||
|
|
**设计模式**: 静态方法 + 回调机制
|
|||
|
|
|
|||
|
|
**职责**:
|
|||
|
|
- 提供车控命令执行接口
|
|||
|
|
- 维护主应用注册的回调函数
|
|||
|
|
- 实现命令执行的解耦
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// 命令回调函数定义
|
|||
|
|
typedef CommandCallback = Future<(bool, Map<String, dynamic>? params)> Function(
|
|||
|
|
VehicleCommandType type, Map<String, dynamic>? params);
|
|||
|
|
|
|||
|
|
// 执行车控命令
|
|||
|
|
static Future<(bool, Map<String, dynamic>? params)> executeCommand(
|
|||
|
|
VehicleCommandType type, {Map<String, dynamic>? params}) async {
|
|||
|
|
// 调用注册的回调函数执行实际车控逻辑
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 3. TextClassificationService - 文本分类服务
|
|||
|
|
|
|||
|
|
**职责**: 对用户输入文本进行意图分类
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
Future<int> classifyText(String text) async {
|
|||
|
|
// HTTP POST请求到分类服务
|
|||
|
|
// 返回分类结果:
|
|||
|
|
// -1: 错误
|
|||
|
|
// 2: 车控命令
|
|||
|
|
// 4: 错误问题
|
|||
|
|
// 其他: 普通问答
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4. VehicleCommandService - 车控命令解析服务
|
|||
|
|
|
|||
|
|
**职责**:
|
|||
|
|
- 解析自然语言为车控命令
|
|||
|
|
- 生成命令执行反馈
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
Future<VehicleCommandResponse?> getCommandFromText(String text) async {
|
|||
|
|
// 1. 发送文本到车控解析服务
|
|||
|
|
// 2. 解析返回的命令列表
|
|||
|
|
// 3. 返回VehicleCommandResponse对象
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
Future<String> getControlResponse(List<String> successCommandList) async {
|
|||
|
|
// 根据成功执行的命令列表生成友好的反馈文本
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🎨 UI层架构分析
|
|||
|
|
|
|||
|
|
### 1. 主界面 (MainScreen)
|
|||
|
|
|
|||
|
|
**设计**: 采用Stack布局,背景图片 + 浮动图标
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
Widget build(BuildContext context) {
|
|||
|
|
return Scaffold(
|
|||
|
|
body: Stack(
|
|||
|
|
children: [
|
|||
|
|
// 背景图片
|
|||
|
|
Container(decoration: BoxDecoration(
|
|||
|
|
image: DecorationImage(
|
|||
|
|
image: AssetImage('assets/images/bg.jpg', package: 'ai_chat_assistant'),
|
|||
|
|
),
|
|||
|
|
)),
|
|||
|
|
// 浮动AI助手图标
|
|||
|
|
FloatingIcon(),
|
|||
|
|
],
|
|||
|
|
),
|
|||
|
|
);
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 浮动图标 (FloatingIcon)
|
|||
|
|
|
|||
|
|
**功能特性**:
|
|||
|
|
- 可拖拽定位
|
|||
|
|
- 状态指示(通过不同图标)
|
|||
|
|
- 点击展开聊天界面
|
|||
|
|
- 动画效果支持
|
|||
|
|
|
|||
|
|
**交互流程**:
|
|||
|
|
1. 长按拖拽调整位置
|
|||
|
|
2. 点击展开部分屏幕聊天界面
|
|||
|
|
3. 根据MessageService状态切换图标
|
|||
|
|
|
|||
|
|
### 3. 聊天界面架构
|
|||
|
|
|
|||
|
|
**部分屏模式** (PartScreen):
|
|||
|
|
- 简化的聊天界面
|
|||
|
|
- 支持语音输入和文本显示
|
|||
|
|
- 可展开到全屏模式
|
|||
|
|
|
|||
|
|
**全屏模式** (FullScreen):
|
|||
|
|
- 完整的聊天功能
|
|||
|
|
- 历史消息展示
|
|||
|
|
- 更多操作按钮
|
|||
|
|
|
|||
|
|
## 🔌 原生平台集成
|
|||
|
|
|
|||
|
|
### Android ASR集成
|
|||
|
|
|
|||
|
|
**Method Channel通信**:
|
|||
|
|
```dart
|
|||
|
|
static const MethodChannel _asrChannel =
|
|||
|
|
MethodChannel('com.example.ai_chat_assistant/ali_sdk');
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**ASR事件处理**:
|
|||
|
|
```dart
|
|||
|
|
_asrChannel.setMethodCallHandler((call) async {
|
|||
|
|
switch (call.method) {
|
|||
|
|
case "onAsrResult":
|
|||
|
|
// 实时更新识别结果
|
|||
|
|
replaceMessage(id: _latestUserMessageId!, text: call.arguments);
|
|||
|
|
break;
|
|||
|
|
case "onAsrStop":
|
|||
|
|
// 识别结束,触发后续处理
|
|||
|
|
if (_asrCompleter != null && !_asrCompleter!.isCompleted) {
|
|||
|
|
_asrCompleter!.complete(messages.last.text);
|
|||
|
|
}
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🛠️ 工具类分析
|
|||
|
|
|
|||
|
|
### CommonUtil
|
|||
|
|
**主要功能**:
|
|||
|
|
- 中文检测: `containChinese(String text)`
|
|||
|
|
- Markdown清理: `cleanText(String text, bool forTts)`
|
|||
|
|
- 公共颜色常量定义
|
|||
|
|
|
|||
|
|
**Markdown清理逻辑**:
|
|||
|
|
```dart
|
|||
|
|
static String cleanText(String text, bool forTts) {
|
|||
|
|
// 1. 清理粗体/斜体标记
|
|||
|
|
// 2. 处理代码块
|
|||
|
|
// 3. 清理表格格式
|
|||
|
|
// 4. 处理链接和图片
|
|||
|
|
// 5. 清理列表和引用
|
|||
|
|
// 6. 规范化空白字符
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔄 数据流分析
|
|||
|
|
|
|||
|
|
### 完整对话流程
|
|||
|
|
|
|||
|
|
```mermaid
|
|||
|
|
graph TD
|
|||
|
|
A[用户点击语音按钮] --> B[startVoiceInput]
|
|||
|
|
B --> C[检查麦克风权限]
|
|||
|
|
C --> D[开始录音/ASR]
|
|||
|
|
D --> E[实时显示识别结果]
|
|||
|
|
E --> F[用户松开按钮]
|
|||
|
|
F --> G[stopAndProcessVoiceInput]
|
|||
|
|
G --> H[调用reply处理文本]
|
|||
|
|
H --> I[文本分类]
|
|||
|
|
I --> J{分类结果}
|
|||
|
|
J -->|车控命令| K[handleVehicleControl]
|
|||
|
|
J -->|普通问答| L[answerQuestion]
|
|||
|
|
J -->|错误问题| M[answerWrongQuestion]
|
|||
|
|
K --> N[解析车控命令]
|
|||
|
|
N --> O[执行TTS播报]
|
|||
|
|
O --> P[执行车控命令]
|
|||
|
|
P --> Q[生成执行反馈]
|
|||
|
|
Q --> R[更新UI显示]
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 状态管理流程
|
|||
|
|
|
|||
|
|
**MessageService状态变化**:
|
|||
|
|
```
|
|||
|
|
idle -> recording -> recognizing -> replying -> idle
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
**消息状态变化**:
|
|||
|
|
```
|
|||
|
|
listening -> normal -> thinking -> executing -> success/failure
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 🔧 配置与扩展
|
|||
|
|
|
|||
|
|
### 1. 插件初始化
|
|||
|
|
|
|||
|
|
```dart
|
|||
|
|
// 在主应用中初始化插件
|
|||
|
|
ChatAssistantApp.initialize(
|
|||
|
|
commandCallback: (VehicleCommandType type, Map<String, dynamic>? params) async {
|
|||
|
|
// 实现具体的车控逻辑
|
|||
|
|
return (true, {'message': '命令执行成功'});
|
|||
|
|
},
|
|||
|
|
);
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 2. 服务端接口配置
|
|||
|
|
|
|||
|
|
**当前硬编码的服务端地址**:
|
|||
|
|
- 文本分类: `http://143.64.185.20:18606/classify`
|
|||
|
|
- 车控解析: `http://143.64.185.20:18606/control`
|
|||
|
|
- 控制反馈: `http://143.64.185.20:18606/control_resp`
|
|||
|
|
|
|||
|
|
**建议改进**: 将服务端地址配置化,支持动态配置
|
|||
|
|
|
|||
|
|
### 3. 资源文件引用
|
|||
|
|
|
|||
|
|
**图片资源**:
|
|||
|
|
- 使用`package: 'ai_chat_assistant'`前缀
|
|||
|
|
- 路径: `assets/images/`
|
|||
|
|
|
|||
|
|
**字体资源**:
|
|||
|
|
- VWHead_Bold.otf
|
|||
|
|
- VWHead_Regular.otf
|
|||
|
|
|
|||
|
|
## 🐛 已知问题与注意事项
|
|||
|
|
|
|||
|
|
### 1. 资源路径问题
|
|||
|
|
当前资源文件引用可能存在路径问题,需要确保在example项目中正确配置package前缀。
|
|||
|
|
|
|||
|
|
### 2. 硬编码服务地址
|
|||
|
|
服务端API地址硬编码,不利于部署和环境切换。
|
|||
|
|
|
|||
|
|
### 3. 错误处理
|
|||
|
|
部分网络请求缺少完善的错误处理和重试机制。
|
|||
|
|
|
|||
|
|
### 4. 内存管理
|
|||
|
|
长时间运行可能存在内存泄漏风险,需要关注Completer和监听器的清理。
|
|||
|
|
|
|||
|
|
## 🚀 扩展建议
|
|||
|
|
|
|||
|
|
### 1. 配置化改进
|
|||
|
|
- 服务端地址配置化
|
|||
|
|
- 支持多语言配置
|
|||
|
|
- 主题自定义配置
|
|||
|
|
|
|||
|
|
### 2. 功能增强
|
|||
|
|
- 添加离线语音识别支持
|
|||
|
|
- 实现消息历史持久化
|
|||
|
|
- 添加更多车控命令类型
|
|||
|
|
|
|||
|
|
### 3. 性能优化
|
|||
|
|
- 实现网络请求缓存
|
|||
|
|
- 优化UI渲染性能
|
|||
|
|
- 添加资源预加载
|
|||
|
|
|
|||
|
|
### 4. 测试完善
|
|||
|
|
- 添加单元测试
|
|||
|
|
- 集成测试覆盖
|
|||
|
|
- 性能测试工具
|
|||
|
|
|
|||
|
|
## 📝 开发流程建议
|
|||
|
|
|
|||
|
|
### 1. 添加新功能
|
|||
|
|
1. 在相应的枚举中定义新类型
|
|||
|
|
2. 在models中添加数据模型
|
|||
|
|
3. 在services中实现业务逻辑
|
|||
|
|
4. 在widgets中创建UI组件
|
|||
|
|
5. 更新主流程集成新功能
|
|||
|
|
|
|||
|
|
### 2. 调试技巧
|
|||
|
|
- 使用`debugPrint`添加关键节点日志
|
|||
|
|
- 通过Provider DevTools监控状态变化
|
|||
|
|
- 使用Flutter Inspector检查UI结构
|
|||
|
|
|
|||
|
|
### 3. 集成测试
|
|||
|
|
- 在example项目中测试完整流程
|
|||
|
|
- 验证车控命令回调机制
|
|||
|
|
- 测试不同场景下的错误处理
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
这份文档涵盖了项目的核心架构、关键代码逻辑、数据流分析和扩展建议,可以帮助您快速理解项目结构并进行后续开发。如有具体问题,可以针对特定模块进行深入分析。
|