From d6ef6eb9a438cef480827ef10a7c1fecb622962b 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:14:13 +0800 Subject: [PATCH] =?UTF-8?q?fix(mobile):=20=E9=80=9A=E8=AE=AF=E5=BD=95?= =?UTF-8?q?=E8=BF=9B=E4=BC=9A=E8=AF=9D=E7=A9=BA=E5=AF=B9=E6=96=B9=20+=20?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E5=90=8E=E4=BC=9A=E8=AF=9D=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E7=A9=BA=E6=80=81=EF=BC=88B-52=20=E6=97=A0=E6=B3=95=E5=8F=91?= =?UTF-8?q?=E9=80=81=E6=B6=88=E6=81=AF=E6=A0=B9=E5=9B=A0=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - contacts_screen 用 f.friendUserID(SDK 恒为空)打开会话,导致建出 si__<空对方> 会话,所有消息发给空 userID 全部失败;改用 f.userID - login 后补一次 refreshConversations:SDK 登录期间同步回调先于 loggedIn=true 触发,refreshConversations 因登录态守卫提前返回, 会话列表永久停在空态 双机实测:修复前 sendMessage userID='' 失败;修复后 A→B 消息 正常送达(B 端 onRecvNewMessage 收到 fixverify999) Co-authored-by: multica-agent --- mobile/lib/screens/contacts_screen.dart | 16 +++++++++++++--- mobile/lib/services/im_service.dart | 3 +++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/mobile/lib/screens/contacts_screen.dart b/mobile/lib/screens/contacts_screen.dart index faaa7ba..3543fe0 100644 --- a/mobile/lib/screens/contacts_screen.dart +++ b/mobile/lib/screens/contacts_screen.dart @@ -238,7 +238,7 @@ class _ContactsScreenState extends State { String _displayName(FriendInfo f) { if (f.remark?.isNotEmpty == true) return f.remark!; - return f.nickname ?? f.friendUserID ?? ''; + return f.nickname ?? f.userID ?? f.friendUserID ?? ''; } Widget _contactTile(FriendInfo f) { @@ -254,11 +254,21 @@ class _ContactsScreenState extends State { ); } - /// 点联系人直接进单聊 + /// 点联系人直接进单聊。 + /// 注意:OpenIM 好友接口返回的字段是 `userID`(`friendUserID` 恒为空), + /// 必须用 `userID` 作为会话源,否则会建出「空对方」会话导致所有消息发不出去。 Future _openChat(FriendInfo f, String name) async { + final peerID = f.userID ?? f.friendUserID ?? ''; + if (peerID.isEmpty) { + if (!mounted) return; + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('对方信息不完整,无法打开会话'), duration: Duration(seconds: 2)), + ); + return; + } try { final conversation = await OpenIM.iMManager.conversationManager.getOneConversation( - sourceID: f.friendUserID ?? '', + sourceID: peerID, sessionType: ConversationType.single, ); conversation.showName = name; diff --git a/mobile/lib/services/im_service.dart b/mobile/lib/services/im_service.dart index 9f03e8f..2ef2446 100644 --- a/mobile/lib/services/im_service.dart +++ b/mobile/lib/services/im_service.dart @@ -253,6 +253,9 @@ class IMService extends ChangeNotifier { selfInfo = user; loggedIn = true; notifyListeners(); + // SDK 登录期间会话同步回调可能先于 loggedIn=true 触发,refreshConversations + // 会因登录态守卫而提前返回,导致会话列表停在空态。登录完成后主动补一次刷新。 + await refreshConversations(); } /// 刷新自己的资料(我的页面展示用)