From 915fa61f0ae8d5ece8f3150e8055fb835668ab22 Mon Sep 17 00:00:00 2001 From: roxy Date: Sat, 9 May 2026 19:18:05 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9D=80=E6=AD=BB=E8=BF=9B=E7=A8=8Bbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/modules/index/index_page.dart | 7 ++-- lib/services/audio/rtc_manager.dart | 50 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/lib/modules/index/index_page.dart b/lib/modules/index/index_page.dart index 8ca9615..1e1c264 100644 --- a/lib/modules/index/index_page.dart +++ b/lib/modules/index/index_page.dart @@ -91,9 +91,10 @@ class _SCIndexPageState extends State }); String roomId = DataPersistence.getLastTimeRoomId(); if (roomId.isNotEmpty) { - SCAccountRepository().quitRoom(roomId).catchError((e) { - return true; // 错误已处理 - }); + Provider.of( + context, + listen: false, + ).cleanupStaleRoomForColdStart(roomId); } } diff --git a/lib/services/audio/rtc_manager.dart b/lib/services/audio/rtc_manager.dart index 676fa27..bd1c235 100644 --- a/lib/services/audio/rtc_manager.dart +++ b/lib/services/audio/rtc_manager.dart @@ -334,6 +334,7 @@ class RealTimeCommunicationManager extends ChangeNotifier { Future? _rtcEngineInitTask; Future? _rtcEnginePrewarmTask; Future? _pendingRoomSwitchAgoraLeaveTask; + final Map> _coldStartRoomCleanupTasks = {}; String? _joiningChannelId; bool _isRefreshingMicList = false; bool _isRefreshingOnlineUsers = false; @@ -433,6 +434,51 @@ class RealTimeCommunicationManager extends ChangeNotifier { this.context = context; } + void cleanupStaleRoomForColdStart(String roomId) { + final normalizedRoomId = roomId.trim(); + if (normalizedRoomId.isEmpty || + _coldStartRoomCleanupTasks.containsKey(normalizedRoomId)) { + return; + } + late final Future cleanupTask; + cleanupTask = _retryExitNetworkRequest( + 'cold start quit room $normalizedRoomId', + () async { + if (_isCurrentRoomId(normalizedRoomId)) { + return; + } + final didQuit = await SCAccountRepository().quitRoom(normalizedRoomId); + if (!didQuit) { + throw StateError('quitRoom returned false'); + } + }, + ).whenComplete(() { + if (identical( + _coldStartRoomCleanupTasks[normalizedRoomId], + cleanupTask, + )) { + _coldStartRoomCleanupTasks.remove(normalizedRoomId); + } + if (DataPersistence.getLastTimeRoomId() == normalizedRoomId) { + unawaited(DataPersistence.setLastTimeRoomId("")); + } + }); + _coldStartRoomCleanupTasks[normalizedRoomId] = cleanupTask; + unawaited(cleanupTask); + } + + Future _waitForColdStartRoomCleanup(String roomId) async { + final normalizedRoomId = roomId.trim(); + if (normalizedRoomId.isEmpty) { + return; + } + final cleanupTask = _coldStartRoomCleanupTasks[normalizedRoomId]; + if (cleanupTask == null) { + return; + } + await cleanupTask; + } + bool get roomVisualEffectsEnabled => _roomVisualEffectsEnabled; bool get isExitingCurrentVoiceRoomSession => @@ -2107,6 +2153,10 @@ class RealTimeCommunicationManager extends ChangeNotifier { SCTts.show('Microphone permission is denied.'); throw ArgumentError('Microphone permission is denied.'); } + await _waitForColdStartRoomCleanup(roomId); + if (!context.mounted) { + return; + } if (roomId == currenRoom?.roomProfile?.roomProfile?.id) { if (_currentRoomIsEntryPreview || _roomStartupStatus == RoomStartupStatus.loading) {