fix: timer 后台回到前台时立即刷新 UI
WeChat 在后台冻结 setInterval,用户从训练页切走再回来时 看到的还是离开前的画面。注册 wx.onAppShow 监听器,回到 前台立即强制 _tick() 一次,UI 跳到真实 elapsed,半程/30s/10s 等延迟到达的提醒也能补触发。
This commit is contained in:
@@ -12,6 +12,17 @@ class Timer {
|
||||
this._running = false
|
||||
this._paused = false
|
||||
this._completed = false
|
||||
this._appShowBound = false
|
||||
|
||||
// WeChat freezes setInterval while the mini-program is in background.
|
||||
// When the user returns, force an immediate tick so the UI jumps to
|
||||
// the actual elapsed time (instead of staying on the last pre-background
|
||||
// frame) and any missed halfway / 30s / 10s reminders can still fire.
|
||||
this._onAppShow = () => {
|
||||
if (this._running && !this._paused) {
|
||||
this._tick()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
start(duration) {
|
||||
@@ -24,6 +35,15 @@ class Timer {
|
||||
this._startTime = Date.now()
|
||||
this._tick()
|
||||
this._intervalId = setInterval(() => { this._tick() }, 1000)
|
||||
|
||||
// Register foreground listener (idempotent — we keep a flag so we don't
|
||||
// double-register if start() is called multiple times in one session)
|
||||
if (!this._appShowBound && typeof wx.onAppShow === 'function') {
|
||||
try {
|
||||
wx.onAppShow(this._onAppShow)
|
||||
this._appShowBound = true
|
||||
} catch (e) {}
|
||||
}
|
||||
}
|
||||
|
||||
pause() {
|
||||
|
||||
Reference in New Issue
Block a user