fix(chat): 首屏失败的「重试」按钮永远不出现 —— 判据极性接反(W52/E 真机验收暴露)

改了什么:
- ChatScreen 里 shouldOfferRetryOnEmpty 的第三个实参从 `state.items.isEmpty()` 改成
  `state.items.isNotEmpty()`。

为什么:判据是 `!loading && hasError && !hasItems`,参数语义是「列表里**有没有**东西」;调用点传的是
`isEmpty()`(极性相反),于是「列表为空」这个**唯一会求值**的场景里结论永远是 false ⇒ 按钮永远不出现。
判据单测用的是正确语义(不含调用点),所以全绿——这条只有真机才会露出来。

怎么定位的:先加一条一次性诊断日志把 UI 实际看到的三个输入打出来(`loading=false hasError=true
items=0 retry=false` —— 三个输入全真而结论为假 ⇒ 只可能是极性),核对判据本体后确认;定位完日志已删。
真机复验:断网冷启动 ⇒ 「消息没能加载出来」+「重试」;恢复网络后点它 ⇒ 发出
`GET /api/v1/sessions/web/messages` 且离线期间落库的那条出现在屏幕上;按钮随列表非空消失。
This commit is contained in:
AskaEth committed 2026-10-06 16:14:27 +08:00
1 parent 126a706422
commit 0054a3a97a
1 file changed
+4 -1
@@ -550,7 +550,10 @@ fun ChatScreen(
val retry = shouldOfferRetryOnEmpty(
loading = state.loading,
hasError = state.error != null,
hasItems = state.items.isEmpty(),
// ⚠️ 语义是「**有没有**东西」而不是「是不是空」——W52/E 第一版这里传了
// `isEmpty()`,极性反了,于是「列表为空」这个唯一会求值的场景里结论**永远为假**、
// 按钮永远不出现(判据单测用的是正确语义,所以全绿;只有真机才露出来)。
hasItems = state.items.isNotEmpty(),
)
CenterHint(
text = if (retry) FIRST_PAGE_FAILED_HINT else EMPTY_CONVERSATION_HINT,