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 { @override AuthState build() => const AuthState.initial(); /// App 启动时从本地存储恢复登录态。 /// 若 token 已在本地可判定过期,直接清理,避免带着废 token 进入主界面。 Future 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 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 logout() async { await LocalStorage.instance.clearAuth(); state = const AuthState.initial(); } } final authProvider = NotifierProvider(AuthNotifier.new);