From 130755f9e1aeebb894d7b161edfd6c56ca65a53f Mon Sep 17 00:00:00 2001
From: Chen Li <422043296@qq.com>
Date: Tue, 12 Aug 2025 13:36:42 +0800
Subject: [PATCH] 0812
---
android/app/build.gradle.kts | 4 +-
android/app/src/debug/AndroidManifest.xml | 1 +
android/app/src/main/AndroidManifest.xml | 5 +-
.../ai_chat_assistant/MainActivity.java | 6 +
android/app/src/profile/AndroidManifest.xml | 2 +
android/build.gradle.kts | 1 +
.../reports/problems/problems-report.html | 663 ++++++++++++++++++
android/gradle.properties | 4 +-
lib/app.dart | 22 +-
lib/config/database_helper.dart | 56 --
lib/enums/message_service_state.dart | 6 +
lib/enums/message_status.dart | 16 +
lib/enums/vehicle_command_type.dart | 29 +
lib/main.dart | 16 +-
lib/models/chat_message.dart | 8 +-
lib/models/message_model.dart | 13 -
lib/models/vehicle_cmd.dart | 36 +
lib/models/vehicle_cmd_response.dart | 11 +
lib/models/vehicle_status_info.dart | 90 +++
lib/screens/chat_screen.dart | 210 ------
lib/screens/full_screen.dart | 88 +++
lib/screens/main_screen.dart | 41 ++
lib/screens/part_screen.dart | 171 +++++
lib/services/audio_recorder_service.dart | 83 +++
lib/services/chat_sse_service.dart | 123 ++++
lib/services/classification_service.dart | 27 +
lib/services/command_service.dart | 126 ++++
lib/services/control_recognition_service.dart | 69 ++
lib/services/location_service.dart | 20 +
lib/services/message_service.dart | 381 ++++++++++
lib/services/redis_service.dart | 33 +
lib/services/tts_service.dart | 608 ++++++++++++++++
lib/services/vehicle_state_service.dart | 98 +++
lib/services/voice_recognition_service.dart | 61 ++
.../theme.dart => themes/AppTheme.dart} | 0
lib/utils/common_util.dart | 60 ++
lib/utils/tts_engine_manager.dart | 56 ++
.../{ai_avatar.dart => assistant_avatar.dart} | 8 +-
lib/widgets/chat_box.dart | 35 +
lib/widgets/chat_bubble.dart | 348 ++++++++-
lib/widgets/chat_footer.dart | 91 +++
lib/widgets/chat_header.dart | 76 ++
lib/widgets/chat_input.dart | 351 ----------
lib/widgets/floating_icon.dart | 98 +++
lib/widgets/gradient_background.dart | 21 +-
lib/widgets/voice_animation.dart | 113 +++
pubspec.yaml | 104 +--
47 files changed, 3728 insertions(+), 761 deletions(-)
create mode 100644 android/app/src/main/java/com/example/ai_chat_assistant/MainActivity.java
create mode 100644 android/build/reports/problems/problems-report.html
delete mode 100644 lib/config/database_helper.dart
create mode 100644 lib/enums/message_service_state.dart
create mode 100644 lib/enums/message_status.dart
create mode 100644 lib/enums/vehicle_command_type.dart
delete mode 100644 lib/models/message_model.dart
create mode 100644 lib/models/vehicle_cmd.dart
create mode 100644 lib/models/vehicle_cmd_response.dart
create mode 100644 lib/models/vehicle_status_info.dart
delete mode 100644 lib/screens/chat_screen.dart
create mode 100644 lib/screens/full_screen.dart
create mode 100644 lib/screens/main_screen.dart
create mode 100644 lib/screens/part_screen.dart
create mode 100644 lib/services/audio_recorder_service.dart
create mode 100644 lib/services/chat_sse_service.dart
create mode 100644 lib/services/classification_service.dart
create mode 100644 lib/services/command_service.dart
create mode 100644 lib/services/control_recognition_service.dart
create mode 100644 lib/services/location_service.dart
create mode 100644 lib/services/message_service.dart
create mode 100644 lib/services/redis_service.dart
create mode 100644 lib/services/tts_service.dart
create mode 100644 lib/services/vehicle_state_service.dart
create mode 100644 lib/services/voice_recognition_service.dart
rename lib/{config/theme.dart => themes/AppTheme.dart} (100%)
create mode 100644 lib/utils/common_util.dart
create mode 100644 lib/utils/tts_engine_manager.dart
rename lib/widgets/{ai_avatar.dart => assistant_avatar.dart} (73%)
create mode 100644 lib/widgets/chat_box.dart
create mode 100644 lib/widgets/chat_footer.dart
create mode 100644 lib/widgets/chat_header.dart
delete mode 100644 lib/widgets/chat_input.dart
create mode 100644 lib/widgets/floating_icon.dart
create mode 100644 lib/widgets/voice_animation.dart
diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts
index 9f11899..c444ffa 100644
--- a/android/app/build.gradle.kts
+++ b/android/app/build.gradle.kts
@@ -6,7 +6,7 @@ plugins {
}
android {
- namespace = "com.example.app003"
+ namespace = "com.example.ai_chat_assistant"
compileSdk = flutter.compileSdkVersion
ndkVersion = "29.0.13599879"
@@ -21,7 +21,7 @@ android {
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
- applicationId = "com.example.app003"
+ applicationId = "com.example.ai_chat_assistant"
// You can update the following values to match your application needs.
// For more information, see: https://flutter.dev/to/review-gradle-config.
minSdk = 24
diff --git a/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
index 399f698..d3aa09c 100644
--- a/android/app/src/debug/AndroidManifest.xml
+++ b/android/app/src/debug/AndroidManifest.xml
@@ -4,4 +4,5 @@
to allow setting breakpoints, to provide hot reload, etc.
-->
+
diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
index 83953f6..fbfedbd 100644
--- a/android/app/src/main/AndroidManifest.xml
+++ b/android/app/src/main/AndroidManifest.xml
@@ -1,6 +1,6 @@
+
+
+
diff --git a/android/app/src/main/java/com/example/ai_chat_assistant/MainActivity.java b/android/app/src/main/java/com/example/ai_chat_assistant/MainActivity.java
new file mode 100644
index 0000000..250bda3
--- /dev/null
+++ b/android/app/src/main/java/com/example/ai_chat_assistant/MainActivity.java
@@ -0,0 +1,6 @@
+package com.example.ai_chat_assistant;
+
+import io.flutter.embedding.android.FlutterActivity;
+
+public class MainActivity extends FlutterActivity {
+}
diff --git a/android/app/src/profile/AndroidManifest.xml b/android/app/src/profile/AndroidManifest.xml
index c872ab8..2debf5a 100644
--- a/android/app/src/profile/AndroidManifest.xml
+++ b/android/app/src/profile/AndroidManifest.xml
@@ -9,4 +9,6 @@
+
+
diff --git a/android/build.gradle.kts b/android/build.gradle.kts
index b17e8f3..0a2b9d0 100644
--- a/android/build.gradle.kts
+++ b/android/build.gradle.kts
@@ -5,6 +5,7 @@ allprojects {
maven { url = uri("https://maven.aliyun.com/repository/public/") }
maven { url = uri("https://maven.aliyun.com/repository/google/") }
maven { url = uri("https://maven.aliyun.com/repository/gradle-plugin/") }
+ maven { url = uri("https://storage.googleapis.com/download.flutter.io")}
}
}
diff --git a/android/build/reports/problems/problems-report.html b/android/build/reports/problems/problems-report.html
new file mode 100644
index 0000000..cc1a359
--- /dev/null
+++ b/android/build/reports/problems/problems-report.html
@@ -0,0 +1,663 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ Gradle Configuration Cache
+
+
+
+
+
+
+ Loading...
+
+
+
+
+
+
+
diff --git a/android/gradle.properties b/android/gradle.properties
index 8bf6f1f..6667208 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,5 +1,5 @@
org.gradle.jvmargs=-Xmx8G -XX:MaxMetaspaceSize=4G -XX:ReservedCodeCacheSize=512m -XX:+HeapDumpOnOutOfMemoryError
android.useAndroidX=true
android.enableJetifier=true
-systemProp.https.proxyHost=127.0.0.1
-systemProp.https.proxyPort=7890
\ No newline at end of file
+#systemProp.https.proxyHost=127.0.0.1
+#systemProp.https.proxyPort=7890
\ No newline at end of file
diff --git a/lib/app.dart b/lib/app.dart
index b84622b..81e730a 100644
--- a/lib/app.dart
+++ b/lib/app.dart
@@ -1,18 +1,26 @@
+import 'package:ai_chat_assistant/themes/AppTheme.dart';
import 'package:flutter/material.dart';
-import 'config/theme.dart';
-import 'screens/chat_screen.dart';
+import 'services/command_service.dart';
+import 'screens/main_screen.dart';
-class AIChatApp extends StatelessWidget {
- const AIChatApp({super.key});
+class ChatAssistantApp extends StatelessWidget {
+ const ChatAssistantApp({super.key});
+
+ /// 初始化聊天助手
+ ///
+ /// [commandCallback] 接收来自AI的车控命令并执行
+ static void initialize({required CommandCallback commandCallback}) {
+ CommandService.registerCallback(commandCallback);
+ }
@override
Widget build(BuildContext context) {
return MaterialApp(
- title: 'AI Chat Assistant',
+ title: 'ai_chat_assistant',
theme: AppTheme.lightTheme,
darkTheme: AppTheme.darkTheme,
themeMode: ThemeMode.system,
- home: const ChatScreen(),
+ home: const MainScreen(),
);
}
-}
\ No newline at end of file
+}
diff --git a/lib/config/database_helper.dart b/lib/config/database_helper.dart
deleted file mode 100644
index 3aa4799..0000000
--- a/lib/config/database_helper.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-import 'dart:io';
-import 'package:sqflite/sqflite.dart';
-import 'package:path/path.dart';
-import 'package:path_provider/path_provider.dart';
-
-class DatabaseHelper {
- static final DatabaseHelper _instance = DatabaseHelper._internal();
- factory DatabaseHelper() => _instance;
- static Database? _database;
-
- DatabaseHelper._internal();
-
- Future get database async {
- if (_database != null) return _database!;
- _database = await _initDatabase();
- return _database!;
- }
-
- Future _initDatabase() async {
- Directory documentsDirectory = await getApplicationDocumentsDirectory();
- String path = join(documentsDirectory.path, 'chat.db');
- return await openDatabase(
- path,
- version: 1,
- onCreate: _onCreate,
- );
- }
-
- Future _onCreate(Database db, int version) async {
- await db.execute('''
- CREATE TABLE messages (
- id INTEGER PRIMARY KEY AUTOINCREMENT,
- role TEXT NOT NULL,
- message TEXT NOT NULL,
- timestamp INTEGER DEFAULT (strftime('%s', 'now'))
- ''');
- }
-
- // 插入一条消息
- Future insertMessage(Map message) async {
- Database db = await database;
- return await db.insert('messages', message);
- }
-
- // 获取所有消息(按时间排序)
- Future>> getMessages() async {
- Database db = await database;
- return await db.query('messages', orderBy: 'timestamp ASC');
- }
-
- // 删除所有消息
- Future clearMessages() async {
- Database db = await database;
- return await db.delete('messages');
- }
-}
\ No newline at end of file
diff --git a/lib/enums/message_service_state.dart b/lib/enums/message_service_state.dart
new file mode 100644
index 0000000..1531820
--- /dev/null
+++ b/lib/enums/message_service_state.dart
@@ -0,0 +1,6 @@
+enum MessageServiceState {
+ idle,
+ recording,
+ recognizing,
+ replying,
+}
\ No newline at end of file
diff --git a/lib/enums/message_status.dart b/lib/enums/message_status.dart
new file mode 100644
index 0000000..1692036
--- /dev/null
+++ b/lib/enums/message_status.dart
@@ -0,0 +1,16 @@
+enum MessageStatus {
+ normal('普通消息', 'Normal'),
+ listening('聆听中', 'Listening'),
+ recognizing('识别中', 'Recognizing'),
+ thinking('思考中', 'Thinking'),
+ completed('完成回答', 'Completed'),
+ executing('执行中', 'Executing'),
+ success('执行成功', 'Success'),
+ failure('执行失败', 'Failure'),
+ aborted('已中止', 'Aborted');
+
+ const MessageStatus(this.chinese, this.english);
+
+ final String chinese;
+ final String english;
+}
diff --git a/lib/enums/vehicle_command_type.dart b/lib/enums/vehicle_command_type.dart
new file mode 100644
index 0000000..56af941
--- /dev/null
+++ b/lib/enums/vehicle_command_type.dart
@@ -0,0 +1,29 @@
+enum VehicleCommandType {
+ unknown('未知', 'unknown'),
+ lock('上锁车门', 'lock'),
+ unlock('解锁车门', 'unlock'),
+ openWindow('打开车窗', 'open window'),
+ closeWindow('关闭车窗', 'close window'),
+ appointAC('预约空调', 'appoint AC'),
+ openAC('打开空调', 'open AC'),
+ closeAC('关闭空调', 'close AC'),
+ changeACTemp('修改空调温度', 'change AC temperature'),
+ coolSharply('极速降温', 'cool sharply'),
+ prepareCar('一键备车', 'prepare car'),
+ meltSnow('一键融雪', 'melt snow'),
+ openTrunk('打开后备箱', 'open trunk'),
+ closeTrunk('关闭后备箱', 'close trunk'),
+ honk('鸣笛', 'honk'),
+ locateCar('定位车辆', 'locate car'),
+ openWheelHeat('开启方向盘加热', 'open wheel heat'),
+ closeWheelHeat('关闭方向盘加热', 'close wheel heat'),
+ openMainSeatHeat('开启主座椅加热', 'open main seat heat'),
+ closeMainSeatHeat('关闭主座椅加热', 'close main seat heat'),
+ openMinorSeatHeat('开启副座椅加热', 'open minor seat heat'),
+ closeMinorSeatHeat('关闭副座椅加热', 'close minor seat heat');
+
+ const VehicleCommandType(this.chinese, this.english);
+
+ final String chinese;
+ final String english;
+}
\ No newline at end of file
diff --git a/lib/main.dart b/lib/main.dart
index 6964b0c..10b0e39 100644
--- a/lib/main.dart
+++ b/lib/main.dart
@@ -1,6 +1,18 @@
import 'package:flutter/material.dart';
+import 'package:permission_handler/permission_handler.dart';
import 'app.dart';
+import 'package:provider/provider.dart';
+import 'services/message_service.dart';
-void main() {
- runApp(const AIChatApp());
+void main() async {
+ WidgetsFlutterBinding.ensureInitialized();
+ if (!await Permission.microphone.isGranted) {
+ await Permission.microphone.request();
+ }
+ runApp(
+ ChangeNotifierProvider(
+ create: (_) => MessageService(),
+ child: const ChatAssistantApp(),
+ ),
+ );
}
diff --git a/lib/models/chat_message.dart b/lib/models/chat_message.dart
index 751ab39..110aa6d 100644
--- a/lib/models/chat_message.dart
+++ b/lib/models/chat_message.dart
@@ -1,11 +1,17 @@
+import '../enums/message_status.dart';
+
class ChatMessage {
+ final String id;
final String text;
final bool isUser;
final DateTime timestamp;
+ MessageStatus status;
ChatMessage({
+ required this.id,
required this.text,
required this.isUser,
required this.timestamp,
+ this.status = MessageStatus.normal,
});
-}
\ No newline at end of file
+}
diff --git a/lib/models/message_model.dart b/lib/models/message_model.dart
deleted file mode 100644
index ac86645..0000000
--- a/lib/models/message_model.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-class Message {
- final String role; // 'user' 或 'assistant'
- final String message;
-
- Message({required this.role, required this.message});
-
- Map toMap() {
- return {
- 'role': role,
- 'message': message,
- };
- }
-}
\ No newline at end of file
diff --git a/lib/models/vehicle_cmd.dart b/lib/models/vehicle_cmd.dart
new file mode 100644
index 0000000..0ca9732
--- /dev/null
+++ b/lib/models/vehicle_cmd.dart
@@ -0,0 +1,36 @@
+import '../enums/vehicle_command_type.dart';
+
+class VehicleCommand {
+ final VehicleCommandType type;
+ final Map? params;
+ final String error;
+
+ VehicleCommand({required this.type, this.params, this.error = ''});
+
+ // 从字符串创建命令(用于从API响应解析)
+ factory VehicleCommand.fromString(
+ String commandStr, Map? params, String error) {
+ // 将字符串转换为枚举值
+ VehicleCommandType type;
+ try {
+ type = VehicleCommandType.values.firstWhere(
+ (e) => e.name == commandStr,
+ orElse: () => VehicleCommandType.unknown,
+ );
+ } catch (e) {
+ print('Error parsing command string: $e');
+ // 默认为搜车指令,或者你可以选择抛出异常
+ type = VehicleCommandType.unknown;
+ }
+
+ return VehicleCommand(type: type, params: params, error: error);
+ }
+
+ // 将命令转换为字符串(用于API请求)
+ String get commandString => type.name;
+
+ @override
+ String toString() {
+ return 'VehicleCommand(command: ${type.name}, params: $params)';
+ }
+}
diff --git a/lib/models/vehicle_cmd_response.dart b/lib/models/vehicle_cmd_response.dart
new file mode 100644
index 0000000..e5c18dd
--- /dev/null
+++ b/lib/models/vehicle_cmd_response.dart
@@ -0,0 +1,11 @@
+import 'package:ai_chat_assistant/models/vehicle_cmd.dart';
+
+class VehicleCommandResponse {
+ final String? tips;
+ final List commands;
+
+ VehicleCommandResponse({
+ this.tips,
+ required this.commands,
+ });
+}
diff --git a/lib/models/vehicle_status_info.dart b/lib/models/vehicle_status_info.dart
new file mode 100644
index 0000000..af7dc63
--- /dev/null
+++ b/lib/models/vehicle_status_info.dart
@@ -0,0 +1,90 @@
+class VehicleStatusInfo {
+ /// 对应车架号
+ String vin = "";
+
+ /// 剩余里程
+ double remainingMileage = 0;
+
+ /// 空调开关状态 开启true,false关闭
+ bool acState = false;
+
+ /// 空调温度 未拿到、不支持都返回0;原始值
+ double acTemp = 0;
+
+ /// AC开关 true打开,false关闭
+ bool acSwitch = false;
+
+ /// 左前锁状态 true解锁,false闭锁
+ bool leftFrontLockState = false;
+
+ /// 右前锁状态 true解锁,false闭锁
+ bool rightFrontLockState = false;
+
+ /// 左后锁状态 true解锁,false闭锁
+ bool leftRearLockState = false;
+
+ /// 右后锁状态 true解锁,false闭锁
+ bool rightRearLockState = false;
+
+ /// 左前门状态 true打开,false关闭
+ bool leftFrontDoorState = false;
+
+ /// 右前门状态 true打开,false关闭
+ bool rightFrontDoorState = false;
+
+ /// 左后门状态 true打开,false关闭
+ bool leftRearDoorState = false;
+
+ /// 右后门状态 true打开,false关闭
+ bool rightRearDoorState = false;
+
+ /// 左前窗状态 true打开,false关闭
+ bool leftFrontWindowState = false;
+
+ /// 右前窗状态 true打开,false关闭
+ bool rightFrontWindowState = false;
+
+ /// 左后窗状态 true打开,false关闭
+ bool leftRearWindowState = false;
+
+ /// 右后窗状态 true打开,false关闭
+ bool rightRearWindowState = false;
+
+ /// 后备箱状态 true打开,false关闭
+ bool trunkState = false;
+
+ /// 电量百分比
+ int soc = 0;
+
+ /// 车内温度
+ double temperatureInside = 0;
+
+ /// 方向盘加热状态 false:未加热 true:加热中
+ bool wheelHeat = false;
+
+ /// 主座椅加热状态 false:未加热 true:加热中
+ bool mainSeatHeat = false;
+
+ /// 副座椅加热档位 false:未加热 true:加热中
+ bool minorSeatHeat = false;
+
+ /// 是否行驶中,仅用于车控前置条件判断
+ bool isDriving = false;
+
+ /// 会员是否过期 true过期,false不过期
+ bool vipExpired = false;
+
+ /// 会员有效期,时间戳,单位毫秒
+ int vipTime = 0;
+
+ /// 距离过期还剩多少天
+ int vipRemainCount = 0;
+
+ /// 车况更新时间 ms
+ int statusUpdateTime = 0;
+
+ @override
+ String toString() {
+ return 'IGKVehicleStatusInfo{vin:$vin, LockState:($leftFrontLockState,$rightFrontLockState,$leftRearLockState,$rightRearLockState), DoorState:($leftFrontDoorState,$rightFrontDoorState,$leftRearDoorState,$rightRearDoorState), WindowState: ($leftFrontWindowState,$rightFrontWindowState,$leftRearWindowState,$rightRearWindowState), trunkState: $trunkState, soc: $soc, remainingMileage: $remainingMileage, acState: $acState, acTemp: $acTemp, acSwitch:$acSwitch, isDriving:$isDriving, vipExpired: $vipExpired, vipTime: $vipTime, vipRemainCount: $vipRemainCount}';
+ }
+}
diff --git a/lib/screens/chat_screen.dart b/lib/screens/chat_screen.dart
deleted file mode 100644
index d5bb6ef..0000000
--- a/lib/screens/chat_screen.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-import 'package:flutter/material.dart';
-import '../widgets/ai_avatar.dart';
-import '../widgets/chat_bubble.dart';
-import '../widgets/chat_input.dart';
-import '../widgets/gradient_background.dart';
-import '../models/chat_message.dart';
-//import 'dart:convert';
-import '../config/database_helper.dart';
-import '../models/message_model.dart';
-
-class ChatScreen extends StatefulWidget {
- const ChatScreen({super.key});
-
- @override
- State createState() => _ChatScreenState();
-}
-
-class _ChatScreenState extends State {
- final List _messages = [];
- int? _currentStreamingMessageIndex;
- int _lastUserMessageCount = 0; // 添加这个变量跟踪用户消息数量
-
- final DatabaseHelper _dbHelper = DatabaseHelper();
- List _messagesDB = [];
-
- void _handleSendMessage(String text) {
- if (text.trim().isEmpty) return;
- setState(() {
- _messages.add(ChatMessage(
- text: text,
- isUser: true,
- timestamp: DateTime.now(),
- ));
- _lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数
- _currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡
- });
- }
-
- // 处理语音识别后的文本
- void _handleAIResponse(String text) {
- setState(() {
- _messages.add(ChatMessage(
- text: text,
- isUser: true, // 用户的消息
- timestamp: DateTime.now(),
- ));
- _lastUserMessageCount = _getUserMessageCount(); // 更新用户消息计数
- _currentStreamingMessageIndex = null; // 重置流索引,强制创建新气泡
-
- _addMessage(Message(
- role: 'user',
- message: text,
- ));
-
- });
- }
-
- // 计算用户消息总数
- int _getUserMessageCount() {
- return _messages.where((msg) => msg.isUser).length;
- }
-
- // 处理 AI 流式响应
- void _handleAIStreamResponse(String text, bool isComplete) {
- // 检查是否有新的用户消息,如果有,应该创建新的AI响应
- final currentUserMessageCount = _getUserMessageCount();
- final hasNewUserMessage = currentUserMessageCount > _lastUserMessageCount;
-
- setState(() {
- if (hasNewUserMessage || _currentStreamingMessageIndex == null) {
- // 有新用户消息或首次响应,创建新气泡
- _messages.add(ChatMessage(
- text: text,
- isUser: false,
- timestamp: DateTime.now(),
- ));
- _currentStreamingMessageIndex = _messages.length - 1;
- _lastUserMessageCount = currentUserMessageCount; // 更新追踪
- } else {
- // 更新现有气泡
- if (_currentStreamingMessageIndex! < _messages.length) {
- _messages[_currentStreamingMessageIndex!] = ChatMessage(
- text: text,
- isUser: false,
- timestamp: _messages[_currentStreamingMessageIndex!].timestamp,
- );
- }
- }
-
- _addMessage(Message(
- role: 'assistant',
- message: text,
- ));
-
- // 如果完成了,重置索引
- if (isComplete) {
- _currentStreamingMessageIndex = null;
- }
- });
- }
-
- Future _loadMessages() async {
- List