up
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../core/network/api_client.dart';
|
||||
import '../core/network/api_exception.dart';
|
||||
import '../core/storage/token_store.dart';
|
||||
import '../models/user_model.dart';
|
||||
import '../services/auth_service.dart';
|
||||
import '../services/user_service.dart';
|
||||
|
||||
/// 登录态:未登录 / 已登录(含用户信息)
|
||||
@@ -37,25 +39,46 @@ class AuthNotifier extends StateNotifier<AuthState> {
|
||||
try {
|
||||
final user = await UserService.fetchMe();
|
||||
state = AuthState(user: user, restored: true);
|
||||
} on ApiException catch (e) {
|
||||
// 仅 Token 确认失效(1002)才清理回游客态;
|
||||
// 网络异常等情况保留 Token,下次启动/请求重试恢复
|
||||
if (e.isUnauthorized) await TokenStore.clear();
|
||||
state = AuthState(restored: true);
|
||||
} catch (_) {
|
||||
// Token 失效(1002 等):本地清理,回游客态
|
||||
await TokenStore.clear();
|
||||
// 未知异常:保守保留 Token
|
||||
state = AuthState(restored: true);
|
||||
}
|
||||
}
|
||||
|
||||
/// 登录/注册成功:Token 已由 AuthService 写入 TokenStore,此处仅刷新用户
|
||||
/// 登录/注册成功:Token 已由 AuthService 写入 TokenStore,此处刷新用户。
|
||||
/// 登录响应里的 user 是简要信息(无 points/bio/gender),
|
||||
/// 需补拉全量资料,否则积分显示为 0、编辑资料保存会把服务端字段清空。
|
||||
Future<void> onLoginSuccess(UserModel user) async {
|
||||
state = AuthState(user: user, restored: true);
|
||||
try {
|
||||
final full = await UserService.fetchMe();
|
||||
state = state.copyWith(user: full);
|
||||
} catch (_) {
|
||||
// 补拉失败不影响登录态,保留简要信息
|
||||
}
|
||||
}
|
||||
|
||||
/// 修改资料/头像后同步当前用户(不改变登录态与 Token)
|
||||
void updateUser(UserModel user) => state = state.copyWith(user: user);
|
||||
|
||||
/// 退出登录:服务端注销 + 本地清理
|
||||
Future<void> logout() async => _onSessionExpired();
|
||||
/// 退出登录:先通知服务端注销(失败忽略,本地照常清理),再清空登录态
|
||||
Future<void> logout() async {
|
||||
try {
|
||||
await AuthService.logout();
|
||||
} catch (_) {
|
||||
// 服务端已不可达或 Token 已失效:本地清理即可
|
||||
}
|
||||
await _clearLocal();
|
||||
}
|
||||
|
||||
Future<void> _onSessionExpired() async {
|
||||
Future<void> _onSessionExpired() async => _clearLocal();
|
||||
|
||||
Future<void> _clearLocal() async {
|
||||
await TokenStore.clear();
|
||||
state = AuthState(restored: true);
|
||||
}
|
||||
|
||||
@@ -151,6 +151,7 @@ class FeedNotifier extends StateNotifier<FeedState> {
|
||||
/// 翻页:滑出即暂停、滑入自动播放并上报观看计费(《01-开发文档》5.3)
|
||||
void onPageChanged(int index) {
|
||||
state = state.copyWith(currentIndex: index);
|
||||
// fire-and-forget:Future 内部会完整 await bindWindow 再 play,调用方不等
|
||||
_bindAndReport(index);
|
||||
// 接近尾部预取下一页
|
||||
if (index >= state.items.length - 3) loadMore();
|
||||
@@ -160,7 +161,7 @@ class FeedNotifier extends StateNotifier<FeedState> {
|
||||
Future<void> _bindAndReport(int index) async {
|
||||
if (index < 0 || index >= state.items.length) return;
|
||||
final items = state.items;
|
||||
pool.bindWindow(
|
||||
await pool.bindWindow(
|
||||
index,
|
||||
[for (final v in items) (videoId: v.videoId, url: resolvePlayUrl(v))],
|
||||
);
|
||||
|
||||
@@ -89,6 +89,7 @@ class MemberNotifier extends StateNotifier<MemberState> {
|
||||
}
|
||||
}
|
||||
|
||||
final memberProvider = StateNotifierProvider<MemberNotifier, MemberState>(
|
||||
/// autoDispose:进入会员页时创建并加载,离开即销毁;登录态变化后自动取最新
|
||||
final memberProvider = StateNotifierProvider.autoDispose<MemberNotifier, MemberState>(
|
||||
MemberNotifier.new,
|
||||
);
|
||||
|
||||
@@ -101,6 +101,8 @@ class WalletNotifier extends StateNotifier<WalletState> {
|
||||
}
|
||||
}
|
||||
|
||||
final walletProvider = StateNotifierProvider<WalletNotifier, WalletState>(
|
||||
/// autoDispose:进入钱包页时创建并加载,离开即销毁;
|
||||
/// 避免登录态切换(登录/会员变更/充值后)仍展示上一次的旧数据
|
||||
final walletProvider = StateNotifierProvider.autoDispose<WalletNotifier, WalletState>(
|
||||
(_) => WalletNotifier(),
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user