1
This commit is contained in:
@@ -37,6 +37,10 @@ final activeFeedStrategyProvider =
|
||||
/// (否则在"我的"等页面退后台再回来会误恢复声音)
|
||||
final feedTabVisibleProvider = StateProvider<bool>((_) => true);
|
||||
|
||||
/// 游客今日免费额度已用尽(全局):所有 Feed 策略/搜索播放统一锁死播放,
|
||||
/// 直到登录成功才解除——避免切换 Tab 或点「再逛逛」后继续免费观看
|
||||
final guestLockedProvider = StateProvider<bool>((_) => false);
|
||||
|
||||
/// Feed 页 UI 事件(Notifier 不持有 BuildContext,通过事件流驱动弹窗/Toast)
|
||||
sealed class FeedEvent {
|
||||
const FeedEvent();
|
||||
@@ -208,6 +212,11 @@ class FeedNotifier extends StateNotifier<FeedState> {
|
||||
/// 翻页:滑出即暂停、滑入自动播放并上报观看计费(《01-开发文档》5.3)
|
||||
void onPageChanged(int index) {
|
||||
if (index < 0 || index >= state.items.length) return;
|
||||
if (_ref.read(guestLockedProvider)) {
|
||||
// 游客已锁:只记位置,不绑定播放
|
||||
state = state.copyWith(currentIndex: index);
|
||||
return;
|
||||
}
|
||||
final item = state.items[index];
|
||||
// 同一视频重新绑定(冷启动跳页)时保留播放位置,否则新页从 0 开始
|
||||
final sameVideo = pool.currentVideoId == item.videoId;
|
||||
@@ -245,6 +254,8 @@ class FeedNotifier extends StateNotifier<FeedState> {
|
||||
/// 绑定播放窗口 + 观看计费上报
|
||||
Future<void> _bindAndReport(int index) async {
|
||||
if (index < 0 || index >= state.items.length) return;
|
||||
// 游客免费额度已用尽:锁死播放(不绑定、不播放),直到登录成功
|
||||
if (_ref.read(guestLockedProvider)) return;
|
||||
final items = state.items;
|
||||
await pool.bindWindow(
|
||||
index,
|
||||
@@ -267,6 +278,8 @@ class FeedNotifier extends StateNotifier<FeedState> {
|
||||
} on ApiException catch (e) {
|
||||
pool.pauseCurrent();
|
||||
if (e.isGuestLimit) {
|
||||
// 全局锁:此后任何策略/搜索播放都不再起播,点「再逛逛」也看不了
|
||||
_ref.read(guestLockedProvider.notifier).state = true;
|
||||
_eventController.add(const FeedGuestLimitEvent());
|
||||
} else if (e.isPointsInsufficient) {
|
||||
final points = (e.data?['points'] as num?)?.toInt() ?? 0;
|
||||
|
||||
Reference in New Issue
Block a user