Files
ai_chat_assistant/CODE_ANALYSIS.md
2025-09-17 15:09:05 +08:00

11 KiB
Raw Blame History

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

enum MessageServiceState {
  idle,        // 空闲状态
  recording,   // 录音中
  recognizing, // 识别中
  replying,    // 回复中
}

MessageStatus

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

class ChatMessage {
  final String id;           // 消息唯一标识
  final String text;         // 消息内容
  final bool isUser;         // 是否为用户消息
  final DateTime timestamp;  // 时间戳
  MessageStatus status;      // 消息状态
}

VehicleCommand

class VehicleCommand {
  final VehicleCommandType type;        // 命令类型
  final Map<String, dynamic>? params;   // 命令参数
  final String error;                   // 错误信息
}

🔄 核心服务层 (Services)

1. MessageService - 核心消息管理服务

设计模式: 单例模式 + 观察者模式

主要职责:

  • 统一管理聊天消息
  • 协调语音识别、AI对话、车控命令执行流程
  • 维护应用状态机

核心方法分析:

语音输入流程

// 开始语音输入
Future<void> startVoiceInput() async {
  // 1. 权限检查
  // 2. 状态验证
  // 3. 初始化录音
  // 4. 调用原生ASR服务
}

// 停止并处理语音输入
Future<void> stopAndProcessVoiceInput() async {
  // 1. 停止录音
  // 2. 等待ASR结果
  // 3. 调用reply()处理识别结果
}

智能回复流程

Future<void> reply(String text) async {
  // 1. 文本分类(TextClassificationService)
  // 2. 根据分类结果路由到不同处理逻辑:
  //    - 车控命令 (category=2) -> handleVehicleControl()
  //    - 普通问答 (default) -> answerQuestion()
  //    - 错误问题 (category=4) -> answerWrongQuestion()
  //    - 系统错误 (category=-1) -> occurError()
}

车控命令处理

Future<void> handleVehicleControl(String text, bool isChinese) async {
  // 1. 调用VehicleCommandService解析命令
  // 2. 执行TTS播报
  // 3. 逐个执行车控命令
  // 4. 处理命令执行结果
  // 5. 生成执行反馈
}

状态管理机制:

  • 使用ChangeNotifier实现响应式状态更新
  • 通过_state维护服务状态机
  • 使用_isReplyAborted实现流程中断控制

2. CommandService - 车控命令处理服务

设计模式: 静态方法 + 回调机制

职责:

  • 提供车控命令执行接口
  • 维护主应用注册的回调函数
  • 实现命令执行的解耦
// 命令回调函数定义
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 - 文本分类服务

职责: 对用户输入文本进行意图分类

Future<int> classifyText(String text) async {
  // HTTP POST请求到分类服务
  // 返回分类结果:
  // -1: 错误
  //  2: 车控命令
  //  4: 错误问题
  //  其他: 普通问答
}

4. VehicleCommandService - 车控命令解析服务

职责:

  • 解析自然语言为车控命令
  • 生成命令执行反馈
Future<VehicleCommandResponse?> getCommandFromText(String text) async {
  // 1. 发送文本到车控解析服务
  // 2. 解析返回的命令列表
  // 3. 返回VehicleCommandResponse对象
}

Future<String> getControlResponse(List<String> successCommandList) async {
  // 根据成功执行的命令列表生成友好的反馈文本
}

🎨 UI层架构分析

1. 主界面 (MainScreen)

设计: 采用Stack布局背景图片 + 浮动图标

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通信:

static const MethodChannel _asrChannel = 
    MethodChannel('com.example.ai_chat_assistant/ali_sdk');

ASR事件处理:

_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清理逻辑:

static String cleanText(String text, bool forTts) {
  // 1. 清理粗体/斜体标记
  // 2. 处理代码块
  // 3. 清理表格格式
  // 4. 处理链接和图片
  // 5. 清理列表和引用
  // 6. 规范化空白字符
}

🔄 数据流分析

完整对话流程

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. 插件初始化

// 在主应用中初始化插件
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项目中测试完整流程
  • 验证车控命令回调机制
  • 测试不同场景下的错误处理

这份文档涵盖了项目的核心架构、关键代码逻辑、数据流分析和扩展建议,可以帮助您快速理解项目结构并进行后续开发。如有具体问题,可以针对特定模块进行深入分析。