This commit is contained in:
lz_db
2026-10-25 20:30:33 +08:00
parent 1d9cd1f9c7
commit 074229f417
14 changed files with 222 additions and 19 deletions
+18 -2
View File
@@ -7,6 +7,7 @@ import 'package:go_router/go_router.dart';
import '../../core/log/action_logger.dart';
import '../../core/theme/app_theme.dart';
import '../../models/video_item.dart';
import '../../providers/auth_provider.dart';
import '../../providers/feed_provider.dart';
import '../../providers/search_provider.dart';
import '../../router.dart';
@@ -66,6 +67,8 @@ class _SearchFeedScreenState extends ConsumerState<SearchFeedScreen>
@override
void didPopNext() {
if (!mounted) return;
// 游客额度已用尽:保持锁定,不恢复播放
if (ref.read(guestLockedProvider)) return;
final notifier = ref.read(feedProvider(_strategy).notifier);
unawaited(() async {
await notifier.pool.resume();
@@ -94,8 +97,9 @@ class _SearchFeedScreenState extends ConsumerState<SearchFeedScreen>
} else if (state == AppLifecycleState.inactive) {
notifier.pool.pauseCurrent();
} else if (state == AppLifecycleState.resumed) {
// 本页不可见时(压在登录页/评论页下)不恢复播放
if (ModalRoute.of(context)?.isCurrent ?? false) {
// 本页不可见时(压在登录页/评论页下)不恢复播放;游客锁定时也不恢复
if ((ModalRoute.of(context)?.isCurrent ?? false) &&
!ref.read(guestLockedProvider)) {
unawaited(() async {
await notifier.pool.resume();
await notifier.rebindCurrent();
@@ -134,6 +138,15 @@ class _SearchFeedScreenState extends ConsumerState<SearchFeedScreen>
final state = ref.watch(feedProvider(_strategy));
final notifier = ref.read(feedProvider(_strategy).notifier);
final keyword = ref.watch(searchProvider).keyword;
final guestLocked = ref.watch(guestLockedProvider);
// 登录成功后解除游客锁并恢复当前视频
ref.listen<AuthState>(authProvider, (previous, next) {
if (next.isLoggedIn && ref.read(guestLockedProvider)) {
ref.read(guestLockedProvider.notifier).state = false;
unawaited(ref.read(feedProvider(_strategy).notifier).rebindCurrent());
}
});
return PopScope(
// 系统返回键/手势也要先停搜索池再放行 pop
@@ -222,6 +235,9 @@ class _SearchFeedScreenState extends ConsumerState<SearchFeedScreen>
bottom: 0,
child: FreeQuotaBanner(remaining: state.freeRemainingToday),
),
// 游客免费额度已用尽:全屏锁(必须登录,点「再逛逛」也无法继续观看)
if (guestLocked) const Positioned.fill(child: GuestLockOverlay()),
],
),
),