constlist: FbMovieCardRow[]=[];constseenPoster: string[]=[];for(constrofrows){if(r.img===''||r.poster===''){continue;}// ① 没海报键的行不进墙
if(seenPoster.indexOf(r.poster)>=0){continue;}// ② 按 poster 去重
seenPoster.push(r.poster);list.push(r);}if(list.length%2===1){list.pop();}// ③ 裁成偶数
三条都不能省:
去重键用 poster,不是 title —— 同名重映 / 译名相同的不同片
不该被合并,只有 poster 相同才是真的同一部。
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
现象(用户反馈)
上一版(
f0d0ab9)修掉了"只有 6 张图",但格数变成了 21 这种单数,两列布局最后一行只剩一个格子,右侧空出一块。
根因(已定位,是上一版修法留下的结构问题)
上一版的设计意图是「网格子数由图数量决定」,做法是:
问题在于两条路径的计数单位不同:
keyslistimg非空就收)⇒ 一部电影看了两场(两天各一场、或重映),两行
poster相同,配图时只下一次、但两行都会拿到同一个
img,于是list里有图的行数 > 图片张数。既可能超过 20,也可能出现奇数。
实测佐证(本轮真机扫描里「镖人:风起大漠」在一屏内出现了两次)。
为什么是"单数"特别刺眼
两列栅格,奇数格必然导致最后一行右侧留空。用户看到的就是"21 张图"。
修复方向
不论走哪条,必须保证
list.length是偶数,且与图片张数自洽。候选:A. 按海报去重后再建行(推荐)
list的语义本来就是"海报墙",一格一部电影而不是一场观影。按
poster去重、取前 N 部,天然不会撞图,且 N 可直接取偶数。副作用:同一部片看两次只显示一格(符合"海报墙"语义,但会少显示记录)。
B. 保留按行,但把总数裁成偶数
list截断到len - (len % 2)。改动最小,但"同一部片出现两格相同海报"在视觉上仍是重复。
C. 按行且不去重,但放开图数上限
keys也改按行收集(同片重复下载)。受 20 张 / 10MB 上限约束,且同一个 URL 下两次是浪费。
验收标准
recentJson)。已修复并编译通过,真机待验(设备掉线)
提交:
acb2ead(fix(card): 观影海报墙格数改偶数并按海报去重 #3)改了什么
entry/src/main/ets/data/FbCardMediaData.ets里list的构造:三条要点:
poster而不是titleposter === ''显式跳过img侥幸非空也不该进墙。写成显式判断,免得以后逻辑变动时漏掉len - (len % 2)而非写死 20/18验证
① 静态守卫:
1324 通过 / 0 失败(新增groupV97()六条)② 反向验证:
13 通过 / 0 失败,6 条注入各自命中目标断言titleCARD_IMG_MAX改 19(奇数)③ 编译:BUILD SUCCESSFUL,产物 6.2M
🔴 反向验证又抓出一条假绿断言
v97的 C 项(去重键不得用 title)第一版这么写:两个变量名都是我猜的。可实际注入是把
seenPoster.indexOf(r.poster)改成seenPoster.indexOf(r.title)——变量名一个都没变,只换了入参 ⇒ 注入后该项仍然 ✅,又一条恒真断言。
改成「任何
indexOf(的入参都不能是r.title」:顺带修掉两个挡住验证的环境问题
与本次 bug 无关,但会让「编译/装机」这一步直接跑不起来:
PackageHap缺 java:只报Error Code: 00308018 Unknown Error,真因
spawn java ENOENT藏在.hvigor/outputs/build-logs/build.log深处。DevEco 自带 jbr 但不会自动进 PATH。
D:/...写法:MSYS2/Git Bash 的 PATH 是冒号分隔的POSIX 路径列表,塞进
D:/Program Files/...时那个冒号会被当分隔符,路径被劈成
D和/Program Files/...两段 ⇒java: command not found,症状和「根本没设」一模一样。必须写
/d/Program Files/...。两条都已写进
familybook_harmonyos_run.sh并加注释。待办
⏸ 真机未验:
hdc list targets又变空了(只剩 COM3/COM4 两个 UART 口),重启 hdc 服务也没恢复。等设备重新连上后,重点验:
代码已落地并推送上库,真机验收因设备掉线暂缓
一、修法(
acb2ead)FbCardMediaData.ets的list构造改成按 poster 去重 + 裁偶数:三条都不能省:
poster,不是title—— 同名重映 / 译名相同的不同片不该被合并,只有 poster 相同才是真的同一部。
poster === ''显式跳过 —— 没海报键的行即使img侥幸非空也不该进墙。len - (len % 2),不写死 20 / 18 —— 图少时(比如只有 7 张)写死减法会变负索引。
二、补一个语义说明(
3e910f1,只改注释)上一版在同一位置写着「这样"格子数"和"图数量"在结构上永远相等」。
这句话是错的,也正是本次 21 格的思想源头:
keyslist两个集合基数不可能恒等,能说的只是「≤,不是 ==」。
把错误断言留在注释里,下一个人会照着它推理、再踩一次同样的坑,所以一并清掉。
三、本地验证(已完成)
entry-default-signed.hap6.2M反向验证的 6 条注入(证明判据不是恒绿):
list按 poster 去重」title→ 命中「去重键不得用 title」CARD_IMG_MAX改成 19 → 命中「图数上限是偶数」list.pop()」四、⏳ 尚未完成:真机验收
设备当前掉线(
hdc list targets只剩COM3/COM4两个 UART 口,重启 hdc 服务后仍为
[Empty]),无法装机。等设备恢复后要确认的四点:
验收没过之前不关单。