From 459049fb16e31f628dcd3a6373a622217c238a8e Mon Sep 17 00:00:00 2001 From: dongliang Date: Wed, 29 Apr 2026 19:40:58 +0930 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BA=A2=E7=82=B9=E7=94=A8preNotificati?= =?UTF-8?q?onStats=E7=B2=BE=E7=A1=AE=E5=AF=B9=E6=AF=94+=E6=9C=89=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=E6=97=B6=E4=B8=8D=E6=9B=B4=E6=96=B0lastStats?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 之前diffStats失败的根因:有通知时fetchStatistics也更新lastStats, 导致基准被污染。 修复: - checkDots=true 时用 preNotificationStats(通知前快照)对比, 不更新 lastStats - checkDots=false(正常刷新)时才更新 lastStats - 这样 preNotificationStats 始终是通知前的干净基准 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../com/xiaoqu/watch/ui/home/HomeFragment.kt | 37 +++++++++++-------- 1 file changed, 22 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt index fb019f1..2025eb9 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt @@ -143,13 +143,9 @@ class HomeFragment : BaseFragment() { renderDots() return } - // 有未读通知 → 所有未 ack 的卡片显示红点 - val ack = notificationManager.acknowledgedCards - activeDotCards.clear() - if (2 !in ack) activeDotCards.add(2) - if (3 !in ack) activeDotCards.add(3) - if (4 !in ack) activeDotCards.add(4) - renderDots() + // 有未读通知 → 用 preNotificationStats 精确对比 + // onResume 时 view 可能重建,需要重新请求 API + fetchStatistics(checkDots = true) } override fun onDestroyView() { @@ -362,22 +358,33 @@ class HomeFragment : BaseFragment() { if (result is ApiResult.Success && result.data != null) { val data = result.data - // 有 pending 通知 → 所有未 ack 的卡片显示红点(不用 diffStats,避免竞态) if (checkDots && notificationManager.pendingCount > 0) { - val ack = notificationManager.acknowledgedCards - if (2 !in ack) activeDotCards.add(2) - if (3 !in ack) activeDotCards.add(3) - if (4 !in ack) activeDotCards.add(4) + // 用 preNotificationStats(通知前快照)做精确对比 + val baseline = notificationManager.preNotificationStats + if (baseline != null) { + val changed = notificationManager.diffStats(baseline, data) + val ack = notificationManager.acknowledgedCards + for (status in changed) { + if (status !in ack) activeDotCards.add(status) + } + } else { + // 无快照(极端情况)→ 所有有值的加红点 + val ack = notificationManager.acknowledgedCards + if (data.waitForTask > 0 && 2 !in ack) activeDotCards.add(2) + if (data.treatTask > 0 && 3 !in ack) activeDotCards.add(3) + if (data.incompleteTask > 0 && 4 !in ack) activeDotCards.add(4) + } renderDots() + // 有通知时不更新 lastStats,保留旧基准给后续 diff + } else { + // 无通知的正常刷新 → 更新 lastStats 基准 + notificationManager.lastStats = data } // 更新数字 tvPoolNum.text = data.waitForTask.toString() tvPunchNum.text = data.treatTask.toString() tvCompleteNum.text = data.incompleteTask.toString() - - // 保存为下次对比基准 - notificationManager.lastStats = data } } }