Flutter中如何将服务器流式字词动态合并为单句?
问题分析与解决
你的代码核心问题有两个:
- 同时维护
newPart和StringBuffer属于冗余操作,StringBuffer本身就是为字符串追加设计的,没必要额外用变量存储累加内容 - 目前每次收到新字词就立即将完整累加内容传递给UI并打印,这会导致UI多次更新、debugPrint逐行输出累加结果,和你预期的仅输出最终完整句子不符
修正方案(按需求选择)
方案1:仅在接收完成后输出完整句子
如果你的需求是等所有字词都接收完毕(收到END标识),再一次性把完整句子传递给UI,修改后的代码如下:
StringBuffer buffer = StringBuffer(); subscription = _channel.stream.listen( (message) { final actualMessage = message['message']; if (actualMessage != 'END') { // 直接将新字词追加到buffer,无需额外变量 buffer.write(actualMessage); } else { // 收到结束标识时,才输出完整内容并传递给UI final fullSentence = buffer.toString().trim(); debugPrint(fullSentence); add(UiEvent.response(message: fullSentence)); // 可选:清空buffer,准备接收下一次流数据 buffer.clear(); } }, onError: (error) { debugPrint("stream Error $error"); }, );
方案2:动态逐步更新UI(保留逐段显示)
如果你的需求是让UI逐步显示句子(比如先显示hi,再更新为hi,,直到完整句),只需要去掉冗余的newPart变量,简化代码即可:
StringBuffer buffer = StringBuffer(); subscription = _channel.stream.listen( (message) { final actualMessage = message['message']; if (actualMessage != 'END') { buffer.write(actualMessage); final currentContent = buffer.toString().trim(); debugPrint(currentContent); // 这里依然会输出累加内容,属于正常的逐步更新日志 add(UiEvent.response(message: currentContent)); } }, onError: (error) { debugPrint("stream Error $error"); }, );
这种情况下,UI每次收到的都是当前完整的累加内容,只要UI端是替换当前显示的文本(而非追加新文本),就会实现“逐步补全句子”的效果,而不是逐行重复显示。
内容的提问来源于stack exchange,提问作者Febin Johnson
相关产品推荐
相关产品推荐

