From c5516b8eb8a1e9c880286f4786fb9cbba1a25b67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BC=96=E7=A0=81=E5=B7=A5=E7=A8=8B=E5=B8=88?= Date: Sun, 16 Aug 2026 02:37:10 +0800 Subject: [PATCH] =?UTF-8?q?fix(mobile):=20=E7=99=BB=E5=BD=95=E5=90=8E?= =?UTF-8?q?=E7=AD=89=E5=BE=85=E4=BC=9A=E8=AF=9D=E5=90=8C=E6=AD=A5=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E5=86=8D=E5=88=B7=E6=96=B0=EF=BC=88=E8=A1=A5=20B-52?= =?UTF-8?q?=20=E6=A0=B9=E5=9B=A0=E4=BF=AE=E5=A4=8D=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit refreshConversations 在登录态守卫与 SDK 10009(登录未完成)间竞争: - login 后立即刷新会拿到 10009;改为等待 onSyncServerFinish (conversationsLoaded)后再拉取,最多 10s 超时兜底 - refreshConversations 内部对 10009 做 5 次短重试 验证:干净登录后 onSyncServerFinish -> getAllConversationList 返回 si_t1001_t1002(Test Two),会话列表不再停空态 Co-authored-by: multica-agent --- mobile/lib/services/im_service.dart | 49 ++++++++++++++++++++--------- 1 file changed, 34 insertions(+), 15 deletions(-) diff --git a/mobile/lib/services/im_service.dart b/mobile/lib/services/im_service.dart index 2ef2446..a523047 100644 --- a/mobile/lib/services/im_service.dart +++ b/mobile/lib/services/im_service.dart @@ -254,7 +254,21 @@ class IMService extends ChangeNotifier { loggedIn = true; notifyListeners(); // SDK 登录期间会话同步回调可能先于 loggedIn=true 触发,refreshConversations - // 会因登录态守卫而提前返回,导致会话列表停在空态。登录完成后主动补一次刷新。 + // 会因登录态守卫而提前返回,导致会话列表停在空态。登录完成后等会话同步 + // (onSyncServerFinish 置 conversationsLoaded)真正结束再刷新一次。 + await _waitSyncThenRefresh(); + } + + /// 等待 SDK 会话同步完成(最多约 10s),随后拉取会话列表。 + Future _waitSyncThenRefresh() async { + for (var i = 0; i < 12; i++) { + if (conversationsLoaded) { + await refreshConversations(); + return; + } + await Future.delayed(const Duration(milliseconds: 800)); + } + // 超时兜底:仍补一次(refreshConversations 内部有重试) await refreshConversations(); } @@ -296,22 +310,27 @@ class IMService extends ChangeNotifier { notifyListeners(); } - /// 重新拉取全部会话并排序(置顶在前,其余按最新消息时间倒序) + /// 重新拉取全部会话并排序(置顶在前,其余按最新消息时间倒序)。 + /// SDK 登录刚完成时立刻调用可能拿到 10009「登录未完成」,这里做短重试。 Future refreshConversations() async { if (!loggedIn) return; - try { - final list = await OpenIM.iMManager.conversationManager.getAllConversationList(); - list.sort((a, b) { - final ap = a.isPinned == true ? 0 : 1; - final bp = b.isPinned == true ? 0 : 1; - if (ap != bp) return ap - bp; - return (b.latestMsgSendTime ?? 0).compareTo(a.latestMsgSendTime ?? 0); - }); - conversations = list; - conversationsLoaded = true; - notifyListeners(); - } catch (_) { - // 拉取失败保留现有列表 + for (var attempt = 0; attempt < 5; attempt++) { + try { + final list = await OpenIM.iMManager.conversationManager.getAllConversationList(); + list.sort((a, b) { + final ap = a.isPinned == true ? 0 : 1; + final bp = b.isPinned == true ? 0 : 1; + if (ap != bp) return ap - bp; + return (b.latestMsgSendTime ?? 0).compareTo(a.latestMsgSendTime ?? 0); + }); + conversations = list; + conversationsLoaded = true; + notifyListeners(); + return; + } catch (_) { + // 登录尚未完成或瞬时失败,短暂等待后重试 + await Future.delayed(const Duration(milliseconds: 800)); + } } }