e80a82bef4
- 更新 http-error-codes, user-points-chat-data-protocol - 更新 divination-run-protocol, profile-protocol - 删除废弃的后端和前端设计计划文档
2.7 KiB
2.7 KiB
Bug: 追问1次后无法进入查看历史记录
日期:2026-04-08 状态:已确认(未修复)
问题描述
追问1次之后追问入口关闭,但用户也没法点击进去查看追问的历史记录。
根因分析
_loadFollowUpEligibility() 方法(divination_result_screen.dart:65-83)将两个概念混为一谈:
Future<void> _loadFollowUpEligibility() async {
...
final messages = await widget.divinationApi!.getSessionMessages(
threadId: widget.data.threadId!,
);
final userCount = messages.where((msg) => msg.role == 'user').length;
...
setState(() {
_canFollowUp = userCount < 2; // 同时控制"能追问"和"能进入"
...
});
}
按钮逻辑(divination_result_screen.dart:367):
onPressed: (!_canFollowUp || _followUpEligibilityLoading)
? null // _canFollowUp = false 时按钮完全禁用
: () {
Navigator.of(context).push(
MaterialPageRoute<void>(
builder: (_) => FollowUpChatScreen(...),
),
);
},
问题:
_canFollowUp = userCount < 2控制的是"是否还有追问配额"- 但
onPressed把它和"是否能进入查看历史"混用了 - 导致用户追问1次后(userCount=2),
_canFollowUp=false,按钮被禁用 - 用户无法进入追问页面查看历史记录
业务逻辑分析:
- 每 session 最多2次追问(首问1次 + 追问1次)
- 追问1次后,用户不能再发送新追问
- 但应该仍能进入查看历史记录
正确的逻辑应该是
// 追问配额判断
_canFollowUp = userCount < 2;
// 能否进入查看历史(与追问次数无关,只要有历史消息就能进入)
_canEnterFollowUpChat = messages.isNotEmpty; // 或者只要有 threadId 就能进
// 按钮文案
buttonText = _canFollowUp ? l10n.followUpEntryHint : l10n.followUpViewHistory;
// 按钮是否禁用
onPressed = (_followUpEligibilityLoading)
? null // 只在加载中时禁用
: () { ... } // 始终可点击进入查看
证据
- 结果页代码:
apps/lib/features/divination/presentation/screens/divination_result_screen.dart_buildFollowUpBar: 行 338-394_loadFollowUpEligibility: 行 65-83- 按钮 onPress: 行 367
- 追问聊天页:
apps/lib/features/divination/presentation/screens/follow_up_chat_screen.dart
修复方向
- 分离"能否追问"和"能否进入查看历史"的逻辑
- 按钮文案根据状态显示不同内容(能追问显示追问提示,已用完显示"查看历史")
- 只要有
threadId,用户就应该能进入查看历史
相关文档
- 随访工程计划:
docs/plans/2026-04-08-followup-session-history-eng-plan.md