diff --git a/superpowers/plans/2026-09-10-ring-health-app-m0-m1.md b/superpowers/plans/2026-09-10-ring-health-app-m0-m1.md index 92b2526..eb13764 100644 --- a/superpowers/plans/2026-09-10-ring-health-app-m0-m1.md +++ b/superpowers/plans/2026-09-10-ring-health-app-m0-m1.md @@ -4288,8 +4288,13 @@ private fun SleepStagesCard(points: List, modifier: Modifier = Modi // 这里改成以最后一个数据点为起床时刻、往前推 8 小时作为入睡时刻 —— 一张卡片讲「一晚」。 // M3 接入真实睡眠数据后改为读取实际分期时段。 val wakeUp = points.lastOrNull()?.timestamp - val fallAsleep = wakeUp?.minus(DEMO_SLEEP_WINDOW_MILLIS) - if (fallAsleep != null && wakeUp != null) { + if (wakeUp != null) { + // 只有拿到起床时刻才渲染这一行;入睡时刻由它推出,所以判空只需判 wakeUp。 + // 原稿写的是 `if (fallAsleep != null && wakeUp != null)`,其中 `wakeUp != null` + // 恒真(fallAsleep 由 wakeUp 推出),Kotlin 会报 "Condition is always 'true'" 告警 + // (ledger Ruling R33)。语义与上式完全等价:wakeUp 为 null 时两者皆 null,跳过; + // 否则 fallAsleep 必然非空,渲染。 + val fallAsleep = wakeUp - DEMO_SLEEP_WINDOW_MILLIS Row( modifier = Modifier.fillMaxWidth().padding(top = 12.dp), horizontalArrangement = Arrangement.SpaceBetween,