From 72705d62671e87f210d12ab9c80db5889edab2ef Mon Sep 17 00:00:00 2001 From: dongliang Date: Sat, 9 May 2026 22:29:07 +0930 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=A7=A3=E7=BB=91=E4=B8=8D=E8=B7=B3?= =?UTF-8?q?=E8=BD=AC+=E7=BB=91=E5=AE=9A=E5=81=B6=E5=B0=94=E5=A4=B1?= =?UTF-8?q?=E8=B4=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 事件监听提前到onViewCreated,不等API返回,避免解绑消息丢失 2. 解绑导航加防护:子页面时先popBack再跳转,防止导航异常 3. 绑定加防重复标记,防止MQTT重发导致多次处理 Co-Authored-By: Claude Opus 4.6 (1M context) --- .../com/xiaoqu/watch/ui/bind/BindFragment.kt | 8 +++++++ .../com/xiaoqu/watch/ui/home/HomeFragment.kt | 22 ++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/com/xiaoqu/watch/ui/bind/BindFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/bind/BindFragment.kt index 6b53435..9a8c637 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/bind/BindFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/bind/BindFragment.kt @@ -148,7 +148,14 @@ class BindFragment : BaseFragment() { * 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() { } catch (e: Exception) { Timber.e(e, "绑定: 处理绑定消息异常") + bindHandled = false // 异常时允许重试 // 异常时恢复二维码显示 showQrCode() } diff --git a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt index c601c66..63e5f3a 100644 --- a/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt +++ b/app/src/main/java/com/xiaoqu/watch/ui/home/HomeFragment.kt @@ -136,7 +136,10 @@ class HomeFragment : BaseFragment() { 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() { .putInt("complete", data.incompleteTask) .apply() } - - // 基准设好后再开始监听事件 - observeEvents() } // 监听打卡状态 @@ -631,7 +631,19 @@ class HomeFragment : BaseFragment() { 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 配置)