|
|
|
@ -382,15 +382,22 @@ class AgentController extends GetxController { |
|
|
|
logger.i('Flutter 结束调用 mcp: $result, $functionCall'); |
|
|
|
if (result.isNotEmpty) { |
|
|
|
final parsedResult = jsonDecode(result); |
|
|
|
final meta = parsedResult["meta"] as String; |
|
|
|
final metaResult = jsonDecode(meta); |
|
|
|
if (meta.isNotEmpty) { |
|
|
|
logger.i('Flutter 结束调用 mcp metaResult: $metaResult'); |
|
|
|
final meta = parsedResult["meta"]; |
|
|
|
Map<String, dynamic> metaResult = {}; |
|
|
|
|
|
|
|
if (meta != null && meta is String && meta.isNotEmpty) { |
|
|
|
try { |
|
|
|
metaResult = jsonDecode(meta); |
|
|
|
} catch (e) { |
|
|
|
print('解析meta数据失败: $e'); |
|
|
|
} |
|
|
|
} |
|
|
|
if(metaResult.isNotEmpty){ |
|
|
|
|
|
|
|
// 判断是否为新的回复或响应ID是否改变 |
|
|
|
if (_isNewAssistantResponse || _currentResponseId != responseId) { |
|
|
|
// 添加新消息 |
|
|
|
messages |
|
|
|
.add(Message(isUser: false, text: "", meta: metaResult)); |
|
|
|
messages.add(Message(isUser: false, text: "", meta: metaResult)); |
|
|
|
_isNewAssistantResponse = false; |
|
|
|
_currentResponseId = responseId; |
|
|
|
} else { |
|
|
|
@ -405,9 +412,6 @@ class AgentController extends GetxController { |
|
|
|
); |
|
|
|
} |
|
|
|
} |
|
|
|
messages.refresh(); |
|
|
|
// 滚动到底部 |
|
|
|
_scrollToBottom(); |
|
|
|
} |
|
|
|
} |
|
|
|
break; |
|
|
|
@ -417,25 +421,6 @@ class AgentController extends GetxController { |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
// 滚动到底部 |
|
|
|
void _scrollToBottom() { |
|
|
|
// 使用reverse:true时,此方法可大部分场景下不再需要 |
|
|
|
// 保留此方法但简化实现,仅用于特殊情况下的手动滚动 |
|
|
|
WidgetsBinding.instance.addPostFrameCallback((_) { |
|
|
|
if (scrollController.hasClients) { |
|
|
|
try { |
|
|
|
scrollController.animateTo( |
|
|
|
0, // 使用reverse:true时,0表示列表底部 |
|
|
|
duration: Duration(milliseconds: 300), |
|
|
|
curve: Curves.easeOut, |
|
|
|
); |
|
|
|
} catch (e) { |
|
|
|
logger.e('滚动到底部失败: $e'); |
|
|
|
} |
|
|
|
} |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
// 发送文本消息 |
|
|
|
Future<void> sendTextMessage() async { |
|
|
|
// 如果图片输入是活跃的,使用选中的图片和文本框的内容 |
|
|
|
|