fix(radar): 过境结束后自动切换到下一个过境

根因:
collectPassAndStartTickLoop() 启动时调用 findCurrentPass() 获取当前过境,
之后进入 while(isActive) 循环每秒 tickPass(),但从不重新检查过境是否结束。
结果:过境 LOS 后雷达页面继续显示旧卫星位置(冻结在地平线),用户必须
手动返回过境列表重新点击下一个过境。

触发条件:
1. 用户在过境进行中打开雷达页面
2. 过境结束时用户仍停留在雷达页面
3. passes 列表中存在后续过境

修复:
每次 tick 开始时检查 timeNow > pass.losTime,如果过境已结束则调用
findCurrentPass() 查找下一个过境。findCurrentPass() 的三级回退逻辑
(精确匹配 → 时间窗口 → 同卫星 → 第一个)保证能拿到合理的下一个过境。
如果找到且与当前 pass 不同,则重新 loadPassData() 加载新过境的电台和轨迹。

影响:
雷达页面现在会无缝切换到下一个过境,用户体验接近实时卫星跟踪软件。
如果 passes 列表为空(所有过境都结束),页面保持最后状态不崩溃。
This commit is contained in:
mckero committed 2026-08-14 11:24:01 +00:00
1 parent 9cfa238e5c
commit a757474b06
1 file changed
+11 -2
@@ -127,9 +127,18 @@ class RadarViewModel(
private fun collectPassAndStartTickLoop() {
viewModelScope.launch {
val pass = findCurrentPass() ?: return@launch
val allRadios = loadPassData(pass)
var pass = findCurrentPass() ?: return@launch
var allRadios = loadPassData(pass)
while (isActive) {
val timeNow = System.currentTimeMillis()
// If current pass has ended, switch to next pass
if (timeNow > pass.losTime) {
val nextPass = findCurrentPass()
if (nextPass != null && nextPass != pass) {
pass = nextPass
allRadios = loadPassData(pass)
}
}
tickPass(pass, allRadios)
delay(1000.milliseconds)
}