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

View File

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