8ca709b86b
根因:onShareAppMessage 未返回 imageUrl,微信默认截页面顶部, 完成弹窗垂直居中导致分享卡片只截到上半部分。 实现: - 隐藏 canvas 2d 绘制 5:4(500x400)成绩海报,含绿色星星图标、状态文案、 大数字时长、连续打卡、底部引导与右下角小程序码 - _saveAndShowCompletion 弹窗数据就绪后预生成,onShareAppMessage 直接复用 - onTrainAgain 清空 _shareImageUrl 防旧图复用 - 新增 static/share-qr.jpg(用户提供的小程序码)
3.9 KiB
3.9 KiB
2026-08-14 工作日志
修复:设置页切换暗黑模式后其他 tab 的 tabBar 不跟随变暗
- 现象:设置页选暗黑模式后,只有设置 tab 的底栏变暗,切到训练/记录/排行 tab 底栏仍是白色,完全退出重进才正常。
- 根因:自定义 tabBar 组件的
pageLifetimes.show()对自定义 tabBar 不触发(微信框架特殊行为——自定义 tabBar 由框架管理,不走普通组件的页面生命周期)。各 tab 页onShow里只做了tb.setData({selected:X})设高亮,没有同步主题;onSelectDarkMode里getCurrentPages()只返回当前 tab 页(其他 tab 不在页面栈里),所以tb.updateTheme()只刷新了设置页的 tabBar 实例。 - 修复:4 个 tab 页
onShow里获取 tabBar 后,在setData({selected:X})之后加一行tb.updateTheme()。updateTheme()内部调applyThemeToPage(this)(有"样式未变则跳过"的优化),不会产生多余渲染。涉及pages/index/index.js、pages/records/records.js、pages/leaderboard/leaderboard.js、pages/settings/settings.js。 - 教训:自定义 tabBar 不能依赖
pageLifetimes做状态同步,必须在各 tab 页onShow里显式调this.getTabBar()更新。
修复:循环训练偶数组数休息语音被「一半」提示吞掉
- 现象:循环训练设 2 组时,第 1 组练完进入休息,本该播
restStart「休息一下」,实际播的是halfway「已完成一半啦」,休息语音不响。 - 根因:偶数 set 数时
sets×hold/2正好落在某组练完→休息切换的那一 tick。_circuitCue先播 halfway 并设_voiceBusyUntil=now+2600占麦;紧接着_advance()→_circuitPhase('resting')检查麦占用,restStart被静音。原代码注释有意让"进度提示优先于阶段提示",但偶数组数下两者撞车。 - 修复:
_circuitCue里先算atRestBoundary(phaseRemaining<=0 && rest>0 && setIndex<sets) 与restWillSpeak(hold>=10 && rest>=5);halfway/last30/last10 在"落在休息边界且 restStart 会播"时跳过自身,让休息语音优先。奇数组数一半点在中段不会撞车,不动;短组配置 rest 不播也保持原 halfway 行为,无回归。改pages/timer/timer.js的_circuitCue。 - 顺带:last30/last10 在更长偶数组数(如 4 组×30s 的 set3→rest)也会撞同一问题,一并按同规则让位,行为一致。
新增:训练完成分享海报(canvas 绘制 + 小程序码)
- 现象:训练完成后点分享,微信默认截取当前页面,因完成弹窗垂直居中,卡片只截到上半部分(绿色星星+"完成!"),大数字和按钮被切掉。
- 方案:用隐藏 canvas 2d 绘制一张 5:4(500×400 逻辑像素)的专用分享海报,在
onShareAppMessage里作为imageUrl返回;提前在_saveAndShowCompletion弹窗数据就绪后生成,避免分享时现场绘制延迟。 - 海报内容:浅灰底 + 顶部品牌 + 白色圆角成绩卡 + 绿色渐变星星图标 + 状态文案 + 大数字时长 + 连续打卡(如有)+ 底部"扫码一起打卡"引导 + 右下角小程序二维码。
- 文件改动:
pages/timer/timer.wxml:添加隐藏<canvas type="2d" id="sharePoster">pages/timer/timer.wxss:.share-poster-canvas移出视口、不响应点击pages/timer/timer.js:新增_drawSharePoster()、_formatShareDuration();_saveAndShowCompletion()里 setData 后预生成;onShareAppMessage()返回imageUrl: this._shareImageUrl;onTrainAgain()清空旧图防止复用static/share-qr.jpg:加入用户提供的小程序二维码资源
- 注意:导出用 jpg quality 0.9、dest 500×400,控制文件在 128KB 以内;二维码路径
/static/share-qr.jpg为相对小程序根目录;若二维码加载失败仍导出无二维码的海报,保证分享入口不灰。