fix: 解绑不跳转+绑定偶尔失败

1. 事件监听提前到onViewCreated,不等API返回,避免解绑消息丢失
2. 解绑导航加防护:子页面时先popBack再跳转,防止导航异常
3. 绑定加防重复标记,防止MQTT重发导致多次处理

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongliang
2026-05-09 22:29:07 +09:30
parent fc9a42b84b
commit 72705d6267
2 changed files with 25 additions and 5 deletions

View File

@@ -148,7 +148,14 @@ class BindFragment : BaseFragment<FragmentBindBinding>() {
* 3. 调用 bindWatchConfirm API 确认
* 4. 导航到首页
*/
/** 防重复处理标记 */
private var bindHandled = false
private fun handleBindSuccess(rawJson: String) {
// 防止重复处理MQTT 可能重发)
if (bindHandled) return
bindHandled = true
try {
Timber.d("绑定: 收到绑定消息 $rawJson")
@@ -185,6 +192,7 @@ class BindFragment : BaseFragment<FragmentBindBinding>() {
} catch (e: Exception) {
Timber.e(e, "绑定: 处理绑定消息异常")
bindHandled = false // 异常时允许重试
// 异常时恢复二维码显示
showQrCode()
}

View File

@@ -136,7 +136,10 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
updateCardNum(tvPunchNum, cachedPunch)
updateCardNum(tvCompleteNum, cachedComplete)
// 再异步请求最新数据,静默更新 + 持久化
// 立即开始监听事件(不等 API 返回,避免解绑等关键消息丢失)
observeEvents()
// 异步请求最新统计数据
viewLifecycleOwner.lifecycleScope.launch {
val result = safeApiCall { taskApi.getStatistics() }
if (result is ApiResult.Success && result.data != null) {
@@ -152,9 +155,6 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
.putInt("complete", data.incompleteTask)
.apply()
}
// 基准设好后再开始监听事件
observeEvents()
}
// 监听打卡状态
@@ -631,7 +631,19 @@ class HomeFragment : BaseFragment<FragmentHomeBinding>() {
Timber.d("首页: 收到解绑消息")
bluetoothScanManager.stop()
userPrefs.clear()
findNavController().navigate(R.id.action_home_to_bind)
try {
// 确保当前在 homeFragment 才能导航
val navController = findNavController()
if (navController.currentDestination?.id == R.id.homeFragment) {
navController.navigate(R.id.action_home_to_bind)
} else {
// 在子页面(任务列表/详情),先弹回首页再跳绑定
navController.popBackStack(R.id.homeFragment, false)
navController.navigate(R.id.action_home_to_bind)
}
} catch (e: Exception) {
Timber.w(e, "首页: 解绑导航异常")
}
}
4 -> {
// 系统参数变更(蓝牙/NFC 配置)