v89 修复服务卡片翻页后时间轴不重绘:ForEach key 加 version 前缀(key 撞车复用旧组件)

This commit is contained in:
2026-10-24 21:53:13 +08:00
parent d69beb629f
commit 7ebe18b2d1
4 changed files with 35 additions and 15 deletions
+12
View File
@@ -141,6 +141,15 @@ export class FbCardData {
nowRatio: number = -1;
/** `15:40` */
nowLabel: string = '';
/** 🔴 v89:本次推送的唯一版本号(`Date.now()`)。
* ⚠️ 卡片 ForEach 的 key **必须**带上前缀:时间轴的冲突组号/空白 key
* (`g0`、`gap0`)每份数据都从 0 重新编号 —— 翻到下一天时 key 一模一样,
* ArkUI ForEach 认为"没变"直接复用旧组件 ⇒ 色块/空白高度全是旧一天的
* (真机实测:10/25、10/26 一直显示 10/24 的「工程管理硕士开题」)。
* 日期头、全天区能更新是因为它们的 key(事件 id)确实变了。
* ⚠️ 用 `Date.now()` 而不是 dayOffset:同一天也可能被定时刷新推新数据
* (日程改了),version 必须每次推送都不同才能逼 ForEach 全量重建。 */
version: string = '';
}
/** 两位补零 */
@@ -327,6 +336,9 @@ export async function fbCardBuild(ctx: common.Context, dayOffset: number): Promi
out.updatedAt = clockText();
out.nowLabel = out.updatedAt;
out.dayOffset = dayOffset;
/* 🔴 v89:每次推送一个新版本号,卡片侧 ForEach key 全部带上前缀 ——
不带的话翻页/刷新时 key 撞车,时间轴整层不重绘(文件头 version 注释)。 */
out.version = Date.now().toString();
out.isToday = dayOffset === 0;
out.nowRatio = out.isToday ? (now.getHours() * 60 + now.getMinutes()) / 1440 : -1;