keep动画重播问题

This commit is contained in:
roxy 2026-05-16 05:05:37 +08:00
parent faaeeded32
commit 8be5c4c334
2 changed files with 96 additions and 14 deletions

View File

@ -499,6 +499,7 @@ class RealTimeCommunicationManager extends ChangeNotifier {
_roomEntryEffectTimer = null; _roomEntryEffectTimer = null;
_roomRocketLaunchAnimationTimer?.cancel(); _roomRocketLaunchAnimationTimer?.cancel();
_roomRocketLaunchAnimationTimer = null; _roomRocketLaunchAnimationTimer = null;
SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag);
_releaseRoomRocketLaunchTopAvatarNotifier(); _releaseRoomRocketLaunchTopAvatarNotifier();
_roomRocketGiftRefreshTimer?.cancel(); _roomRocketGiftRefreshTimer?.cancel();
_roomRocketGiftRefreshTimer = null; _roomRocketGiftRefreshTimer = null;
@ -3768,6 +3769,7 @@ class RealTimeCommunicationManager extends ChangeNotifier {
_roomEntryEffectTimer = null; _roomEntryEffectTimer = null;
_roomRocketLaunchAnimationTimer?.cancel(); _roomRocketLaunchAnimationTimer?.cancel();
_roomRocketLaunchAnimationTimer = null; _roomRocketLaunchAnimationTimer = null;
SmartDialog.dismiss(tag: _roomRocketPagLaunchDialogTag);
_releaseRoomRocketLaunchTopAvatarNotifier(); _releaseRoomRocketLaunchTopAvatarNotifier();
_roomRocketGiftRefreshTimer?.cancel(); _roomRocketGiftRefreshTimer?.cancel();
_roomRocketGiftRefreshTimer = null; _roomRocketGiftRefreshTimer = null;

View File

@ -136,6 +136,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
static const int _roomRocketRewardPendingTtlMs = 120000; static const int _roomRocketRewardPendingTtlMs = 120000;
static const int _roomRocketRewardProbeTtlMs = 120000; static const int _roomRocketRewardProbeTtlMs = 120000;
static const int _roomRocketLaunchCountdownRetainMs = 10000; static const int _roomRocketLaunchCountdownRetainMs = 10000;
static const int _roomRocketLaunchEffectConsumedTtlMs = 120000;
static const Duration _createRoomGroupTimeout = Duration(seconds: 12); static const Duration _createRoomGroupTimeout = Duration(seconds: 12);
static const List<Duration> _roomRocketRewardPopupRetryDelays = [ static const List<Duration> _roomRocketRewardPopupRetryDelays = [
Duration(milliseconds: 700), Duration(milliseconds: 700),
@ -269,6 +270,8 @@ class RealTimeMessagingManager extends ChangeNotifier {
final _pendingRoomRocketCountdownLaunches = final _pendingRoomRocketCountdownLaunches =
<String, RoomRocketLaunchBroadcastMessage>{}; <String, RoomRocketLaunchBroadcastMessage>{};
final Map<String, Timer> _roomRocketLaunchEffectTimers = <String, Timer>{}; final Map<String, Timer> _roomRocketLaunchEffectTimers = <String, Timer>{};
final Map<String, int> _consumedRoomRocketLaunchEffectTimes = <String, int>{};
final Set<String> _hiddenCurrentRoomRocketLaunchKeys = <String>{};
Timer? _roomRocketRewardPopupRetryTimer; Timer? _roomRocketRewardPopupRetryTimer;
Timer? _roomRocketRoomReadyRewardRetryTimer; Timer? _roomRocketRoomReadyRewardRetryTimer;
int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken; int get currentLuckGiftBurstPlaybackToken => _luckGiftPushPlaybackToken;
@ -2020,8 +2023,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
publishRegionBroadcast: true, publishRegionBroadcast: true,
); );
} else { } else {
_rememberRoomRocketLaunchCountdown(launch); _rememberRoomRocketLaunchCountdown(
_markRoomRocketRewardProbe(launch.roomId); launch,
suppressReplayAfterDue: true,
);
_publishRoomRocketRegionBroadcastIfNeeded(launch); _publishRoomRocketRegionBroadcastIfNeeded(launch);
} }
} }
@ -2038,8 +2043,6 @@ class RealTimeMessagingManager extends ChangeNotifier {
if (!launch.isValid) { if (!launch.isValid) {
return; return;
} }
_rememberRoomRocketLaunchCountdown(launch);
var isCurrentRoom = false; var isCurrentRoom = false;
var isCurrentVisibleRoom = false; var isCurrentVisibleRoom = false;
final currentContext = context; final currentContext = context;
@ -2060,11 +2063,19 @@ class RealTimeMessagingManager extends ChangeNotifier {
rtcProvider: rtcProvider, rtcProvider: rtcProvider,
launch: launch, launch: launch,
); );
} else {
_rememberRoomRocketLaunchCountdown(
launch,
suppressReplayAfterDue: true,
);
} }
} }
} }
if (!isCurrentVisibleRoom) { if (!isCurrentRoom) {
_rememberRoomRocketLaunchCountdown(launch);
}
if (!isCurrentVisibleRoom && !isCurrentRoom) {
_markRoomRocketRewardProbe(launch.roomId); _markRoomRocketRewardProbe(launch.roomId);
} }
if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) { if (isCurrentRoom && !isCurrentVisibleRoom && !isRegionBroadcast) {
@ -2141,10 +2152,13 @@ class RealTimeMessagingManager extends ChangeNotifier {
final resumedLaunch = _resumeRoomRocketLaunchForCurrentRoom( final resumedLaunch = _resumeRoomRocketLaunchForCurrentRoom(
normalizedRoomId, normalizedRoomId,
); );
if (pending == null && !hasProbe) { final pendingAfterResume = _pendingRoomRocketRewardPopups[normalizedRoomId];
final hasProbeAfterResume =
_recentRoomRocketRewardProbeTimes[normalizedRoomId] != null;
if (pendingAfterResume == null && !hasProbeAfterResume) {
return; return;
} }
if (!resumedLaunch && pending == null && attempt == 0) { if (!resumedLaunch && pendingAfterResume == null && attempt == 0) {
_scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt); _scheduleRoomRocketReadyRewardRetry(normalizedRoomId, attempt);
return; return;
} }
@ -2156,7 +2170,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
_showRoomRocketRewardPopupDialog( _showRoomRocketRewardPopupDialog(
normalizedRoomId, normalizedRoomId,
initialRoomRecords: initialRoomRecords:
pending?.initialRoomRecords ?? pendingAfterResume?.initialRoomRecords ??
const <SCRoomRocketRewardRecordRes>[], const <SCRoomRocketRewardRecordRes>[],
), ),
); );
@ -2223,15 +2237,18 @@ class RealTimeMessagingManager extends ChangeNotifier {
void _clearRoomRocketRewardFallbackState() { void _clearRoomRocketRewardFallbackState() {
_pendingRoomRocketRewardPopups.clear(); _pendingRoomRocketRewardPopups.clear();
_recentRoomRocketRewardProbeTimes.clear(); _recentRoomRocketRewardProbeTimes.clear();
_consumedRoomRocketLaunchEffectTimes.clear();
_hiddenCurrentRoomRocketLaunchKeys.clear();
_roomRocketRoomReadyRewardRetryTimer?.cancel(); _roomRocketRoomReadyRewardRetryTimer?.cancel();
_roomRocketRoomReadyRewardRetryTimer = null; _roomRocketRoomReadyRewardRetryTimer = null;
_clearRoomRocketLaunchCountdownState(); _clearRoomRocketLaunchCountdownState();
} }
void _rememberRoomRocketLaunchCountdown( void _rememberRoomRocketLaunchCountdown(
RoomRocketLaunchBroadcastMessage launch, RoomRocketLaunchBroadcastMessage launch, {
) { bool suppressReplayAfterDue = false,
if (!launch.isValid) { }) {
if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) {
return; return;
} }
final now = DateTime.now().millisecondsSinceEpoch; final now = DateTime.now().millisecondsSinceEpoch;
@ -2245,12 +2262,15 @@ class RealTimeMessagingManager extends ChangeNotifier {
_roomRocketLaunchCountdownDueTimes[key] = dueAt; _roomRocketLaunchCountdownDueTimes[key] = dueAt;
_roomRocketLaunchCountdownKeysByRoom[launch.roomId] = key; _roomRocketLaunchCountdownKeysByRoom[launch.roomId] = key;
_pendingRoomRocketCountdownLaunches[launch.roomId] = launch; _pendingRoomRocketCountdownLaunches[launch.roomId] = launch;
if (suppressReplayAfterDue) {
_hiddenCurrentRoomRocketLaunchKeys.add(key);
}
} }
void _scheduleRoomRocketLaunchEffectsAfterCountdown( void _scheduleRoomRocketLaunchEffectsAfterCountdown(
RoomRocketLaunchBroadcastMessage launch, RoomRocketLaunchBroadcastMessage launch,
) { ) {
if (!launch.isValid) { if (!launch.isValid || _hasConsumedRoomRocketLaunchEffect(launch)) {
return; return;
} }
_rememberRoomRocketLaunchCountdown(launch); _rememberRoomRocketLaunchCountdown(launch);
@ -2278,14 +2298,18 @@ class RealTimeMessagingManager extends ChangeNotifier {
void _playRoomRocketLaunchEffectsAndReward( void _playRoomRocketLaunchEffectsAndReward(
RoomRocketLaunchBroadcastMessage launch, RoomRocketLaunchBroadcastMessage launch,
) { ) {
if (_hasConsumedRoomRocketLaunchEffect(launch)) {
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
return;
}
_clearRoomRocketLaunchCountdownForRoom(launch.roomId); _clearRoomRocketLaunchCountdownForRoom(launch.roomId);
if (!_isCurrentVisibleVoiceRoom(launch.roomId)) { if (!_isCurrentVisibleVoiceRoom(launch.roomId)) {
_markRoomRocketRewardProbe(launch.roomId); _consumeRoomRocketLaunchWithoutEffects(launch);
return; return;
} }
final currentContext = context; final currentContext = context;
if (currentContext == null || !currentContext.mounted) { if (currentContext == null || !currentContext.mounted) {
_markRoomRocketRewardProbe(launch.roomId); _consumeRoomRocketLaunchWithoutEffects(launch);
return; return;
} }
final rtcProvider = Provider.of<RealTimeCommunicationManager>( final rtcProvider = Provider.of<RealTimeCommunicationManager>(
@ -2297,6 +2321,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
_recentRoomRocketRewardProbeTimes.containsKey(launch.roomId); _recentRoomRocketRewardProbeTimes.containsKey(launch.roomId);
final pending = _pendingRoomRocketRewardPopups.remove(launch.roomId); final pending = _pendingRoomRocketRewardPopups.remove(launch.roomId);
_recentRoomRocketRewardProbeTimes.remove(launch.roomId); _recentRoomRocketRewardProbeTimes.remove(launch.roomId);
_markRoomRocketLaunchEffectConsumed(launch);
rtcProvider.handleRoomRocketLaunchBroadcast(launch); rtcProvider.handleRoomRocketLaunchBroadcast(launch);
if (shouldFetchReward) { if (shouldFetchReward) {
unawaited( unawaited(
@ -2316,6 +2341,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
if (launch == null || !_isCurrentVisibleVoiceRoom(normalizedRoomId)) { if (launch == null || !_isCurrentVisibleVoiceRoom(normalizedRoomId)) {
return false; return false;
} }
if (_hasConsumedRoomRocketLaunchEffect(launch)) {
_clearRoomRocketLaunchCountdownForRoom(normalizedRoomId);
return false;
}
final currentContext = context; final currentContext = context;
if (currentContext == null || !currentContext.mounted) { if (currentContext == null || !currentContext.mounted) {
return false; return false;
@ -2325,7 +2354,9 @@ class RealTimeMessagingManager extends ChangeNotifier {
listen: false, listen: false,
); );
final remaining = _roomRocketLaunchCountdownRemaining(normalizedRoomId); final remaining = _roomRocketLaunchCountdownRemaining(normalizedRoomId);
final launchKey = _roomRocketLaunchCountdownKey(launch);
if (remaining > Duration.zero) { if (remaining > Duration.zero) {
_hiddenCurrentRoomRocketLaunchKeys.remove(launchKey);
_addRoomRocketLaunchNoticeIfNeeded( _addRoomRocketLaunchNoticeIfNeeded(
rtcProvider: rtcProvider, rtcProvider: rtcProvider,
launch: launch, launch: launch,
@ -2333,6 +2364,10 @@ class RealTimeMessagingManager extends ChangeNotifier {
); );
_scheduleRoomRocketLaunchEffectsAfterCountdown(launch); _scheduleRoomRocketLaunchEffectsAfterCountdown(launch);
} else { } else {
if (_hiddenCurrentRoomRocketLaunchKeys.remove(launchKey)) {
_consumeRoomRocketLaunchWithoutEffects(launch);
return false;
}
_playRoomRocketLaunchEffectsAndReward(launch); _playRoomRocketLaunchEffectsAndReward(launch);
} }
return true; return true;
@ -2399,6 +2434,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
_roomRocketLaunchCountdownDueTimes.clear(); _roomRocketLaunchCountdownDueTimes.clear();
_roomRocketLaunchCountdownKeysByRoom.clear(); _roomRocketLaunchCountdownKeysByRoom.clear();
_pendingRoomRocketCountdownLaunches.clear(); _pendingRoomRocketCountdownLaunches.clear();
_hiddenCurrentRoomRocketLaunchKeys.clear();
for (final timer in _roomRocketLaunchEffectTimers.values) { for (final timer in _roomRocketLaunchEffectTimers.values) {
timer.cancel(); timer.cancel();
} }
@ -2411,10 +2447,51 @@ class RealTimeMessagingManager extends ChangeNotifier {
if (key != null) { if (key != null) {
_roomRocketLaunchCountdownDueTimes.remove(key); _roomRocketLaunchCountdownDueTimes.remove(key);
_roomRocketLaunchEffectTimers.remove(key)?.cancel(); _roomRocketLaunchEffectTimers.remove(key)?.cancel();
_hiddenCurrentRoomRocketLaunchKeys.remove(key);
} }
_pendingRoomRocketCountdownLaunches.remove(normalizedRoomId); _pendingRoomRocketCountdownLaunches.remove(normalizedRoomId);
} }
bool _hasConsumedRoomRocketLaunchEffect(
RoomRocketLaunchBroadcastMessage launch,
) {
final key = _roomRocketLaunchCountdownKey(launch);
if (key.isEmpty) {
return false;
}
_pruneConsumedRoomRocketLaunchEffects(
DateTime.now().millisecondsSinceEpoch,
);
return _consumedRoomRocketLaunchEffectTimes.containsKey(key);
}
void _markRoomRocketLaunchEffectConsumed(
RoomRocketLaunchBroadcastMessage launch,
) {
final key = _roomRocketLaunchCountdownKey(launch);
if (key.isEmpty) {
return;
}
_consumedRoomRocketLaunchEffectTimes[key] =
DateTime.now().millisecondsSinceEpoch;
_hiddenCurrentRoomRocketLaunchKeys.remove(key);
}
void _consumeRoomRocketLaunchWithoutEffects(
RoomRocketLaunchBroadcastMessage launch,
) {
_clearRoomRocketLaunchCountdownForRoom(launch.roomId);
_pendingRoomRocketRewardPopups.remove(launch.roomId);
_recentRoomRocketRewardProbeTimes.remove(launch.roomId);
_markRoomRocketLaunchEffectConsumed(launch);
}
void _pruneConsumedRoomRocketLaunchEffects(int now) {
_consumedRoomRocketLaunchEffectTimes.removeWhere(
(_, timestamp) => now - timestamp > _roomRocketLaunchEffectConsumedTtlMs,
);
}
void _handleCurrentVisibleRoomRocketLaunch({ void _handleCurrentVisibleRoomRocketLaunch({
required RealTimeCommunicationManager rtcProvider, required RealTimeCommunicationManager rtcProvider,
required RoomRocketLaunchBroadcastMessage launch, required RoomRocketLaunchBroadcastMessage launch,
@ -2965,6 +3042,7 @@ class RealTimeMessagingManager extends ChangeNotifier {
_recentRoomRocketLaunchLooseTimes.removeWhere( _recentRoomRocketLaunchLooseTimes.removeWhere(
(_, timestamp) => now - timestamp > _roomRocketLaunchLooseRecentTtlMs, (_, timestamp) => now - timestamp > _roomRocketLaunchLooseRecentTtlMs,
); );
_pruneConsumedRoomRocketLaunchEffects(now);
} }
String _roomRocketLaunchNoticeKeyForValues({ String _roomRocketLaunchNoticeKeyForValues({
@ -4006,6 +4084,8 @@ class RealTimeMessagingManager extends ChangeNotifier {
_recentRoomRocketLaunchTimes.clear(); _recentRoomRocketLaunchTimes.clear();
_recentRoomRocketLaunchLooseTimes.clear(); _recentRoomRocketLaunchLooseTimes.clear();
_recentRoomRocketRegionBroadcastTimes.clear(); _recentRoomRocketRegionBroadcastTimes.clear();
_consumedRoomRocketLaunchEffectTimes.clear();
_hiddenCurrentRoomRocketLaunchKeys.clear();
_roomRocketRewardPopupRetryTimer?.cancel(); _roomRocketRewardPopupRetryTimer?.cancel();
_roomRocketRewardPopupRetryTimer = null; _roomRocketRewardPopupRetryTimer = null;
onNewMessageListenerGroupMap.forEach((k, v) { onNewMessageListenerGroupMap.forEach((k, v) {