first commit
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
||||
import '../core/storage/local_storage.dart';
|
||||
import '../models/auth_response.dart';
|
||||
import '../utils/jwt_util.dart';
|
||||
|
||||
class AuthState {
|
||||
final String? token;
|
||||
final UserInfo? user;
|
||||
|
||||
const AuthState({this.token, this.user});
|
||||
|
||||
bool get isLoggedIn => token != null && token!.isNotEmpty;
|
||||
|
||||
const AuthState.initial() : this._();
|
||||
|
||||
const AuthState._({this.token, this.user});
|
||||
}
|
||||
|
||||
class AuthNotifier extends Notifier<AuthState> {
|
||||
@override
|
||||
AuthState build() => const AuthState.initial();
|
||||
|
||||
/// App 启动时从本地存储恢复登录态。
|
||||
/// 若 token 已在本地可判定过期,直接清理,避免带着废 token 进入主界面。
|
||||
Future<void> load() async {
|
||||
final token = LocalStorage.instance.getToken();
|
||||
if (token == null || token.isEmpty) return;
|
||||
|
||||
if (isJwtExpired(token)) {
|
||||
await LocalStorage.instance.clearAuth();
|
||||
return;
|
||||
}
|
||||
|
||||
final userInfo = LocalStorage.instance.getUserInfo();
|
||||
state = AuthState(token: token, user: userInfo == null ? null : UserInfo.fromJson(userInfo));
|
||||
}
|
||||
|
||||
/// 登录/注册成功后调用:持久化并更新状态
|
||||
Future<void> loginSuccess(AuthResponse response) async {
|
||||
final user = UserInfo(
|
||||
username: response.username ?? '',
|
||||
nickname: response.nickname ?? response.username ?? '',
|
||||
);
|
||||
await LocalStorage.instance.setAuth(token: response.token, userInfo: user.toJson());
|
||||
state = AuthState(token: response.token, user: user);
|
||||
}
|
||||
|
||||
Future<void> logout() async {
|
||||
await LocalStorage.instance.clearAuth();
|
||||
state = const AuthState.initial();
|
||||
}
|
||||
}
|
||||
|
||||
final authProvider = NotifierProvider<AuthNotifier, AuthState>(AuthNotifier.new);
|
||||
Reference in New Issue
Block a user