Files
ai_english/client/lib/shared/providers/auth_provider.dart
2025-11-17 14:09:17 +08:00

289 lines
6.8 KiB
Dart
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:flutter/foundation.dart';
import '../models/user_model.dart';
import '../models/api_response.dart';
import '../services/auth_service.dart';
import '../../core/storage/storage_service.dart';
import '../../core/constants/app_constants.dart';
/// 认证状态
enum AuthState {
initial,
loading,
authenticated,
unauthenticated,
error,
}
/// 认证Provider
class AuthProvider extends ChangeNotifier {
final AuthService _authService = AuthService();
AuthState _state = AuthState.initial;
UserModel? _user;
String? _errorMessage;
bool _isLoading = false;
// Getters
AuthState get state => _state;
UserModel? get user => _user;
String? get errorMessage => _errorMessage;
bool get isLoading => _isLoading;
bool get isAuthenticated => _state == AuthState.authenticated && _user != null;
/// 初始化认证状态
Future<void> initialize() async {
_setLoading(true);
try {
if (_authService.isLoggedIn()) {
final cachedUser = _authService.getCachedUser();
if (cachedUser != null) {
_user = cachedUser;
_setState(AuthState.authenticated);
// 尝试刷新用户信息
await _refreshUserInfo();
} else {
_setState(AuthState.unauthenticated);
}
} else {
_setState(AuthState.unauthenticated);
}
} catch (e) {
_setError('初始化失败: $e');
} finally {
_setLoading(false);
}
}
/// 用户注册
Future<bool> register({
required String username,
required String email,
required String password,
required String nickname,
String? phone,
}) async {
_setLoading(true);
_clearError();
try {
final response = await _authService.register(
username: username,
email: email,
password: password,
nickname: nickname,
phone: phone,
);
if (response.success && response.data != null && response.data!.user != null) {
_user = UserModel.fromJson(response.data!.user!);
_setState(AuthState.authenticated);
return true;
} else {
_setError(response.message);
return false;
}
} catch (e) {
_setError('注册失败: $e');
return false;
} finally {
_setLoading(false);
}
}
/// 用户登录
Future<bool> login({
required String account, // 用户名或邮箱
required String password,
bool rememberMe = false,
}) async {
_setLoading(true);
_clearError();
try {
final response = await _authService.login(
account: account,
password: password,
rememberMe: rememberMe,
);
if (response.success && response.data != null && response.data!.user != null) {
_user = UserModel.fromJson(response.data!.user!);
_setState(AuthState.authenticated);
return true;
} else {
_setError(response.message);
return false;
}
} catch (e) {
_setError('登录失败: $e');
return false;
} finally {
_setLoading(false);
}
}
/// 用户登出
Future<void> logout() async {
_setLoading(true);
try {
await _authService.logout();
} catch (e) {
// 即使登出请求失败,也要清除本地状态
debugPrint('Logout error: $e');
} finally {
_user = null;
_setState(AuthState.unauthenticated);
_setLoading(false);
}
}
/// 刷新用户信息
Future<void> _refreshUserInfo() async {
try {
final response = await _authService.getCurrentUser();
if (response.success && response.data != null) {
_user = response.data;
notifyListeners();
}
} catch (e) {
debugPrint('Refresh user info error: $e');
}
}
/// 更新用户信息
Future<bool> updateProfile({
String? nickname,
String? avatar,
String? phone,
DateTime? birthday,
String? gender,
String? bio,
String? learningLevel,
String? targetLanguage,
String? nativeLanguage,
int? dailyGoal,
}) async {
_setLoading(true);
_clearError();
try {
final response = await _authService.updateProfile(
nickname: nickname,
avatar: avatar,
phone: phone,
birthday: birthday,
gender: gender,
bio: bio,
learningLevel: learningLevel,
targetLanguage: targetLanguage,
nativeLanguage: nativeLanguage,
dailyGoal: dailyGoal,
);
if (response.success && response.data != null) {
_user = response.data;
notifyListeners();
return true;
} else {
_setError(response.message);
return false;
}
} catch (e) {
_setError('更新个人信息失败: $e');
return false;
} finally {
_setLoading(false);
}
}
/// 修改密码
Future<bool> changePassword({
required String currentPassword,
required String newPassword,
required String confirmPassword,
}) async {
_setLoading(true);
_clearError();
try {
final response = await _authService.changePassword(
currentPassword: currentPassword,
newPassword: newPassword,
confirmPassword: confirmPassword,
);
if (response.success) {
return true;
} else {
_setError(response.message);
return false;
}
} catch (e) {
_setError('修改密码失败: $e');
return false;
} finally {
_setLoading(false);
}
}
/// 刷新Token
Future<bool> refreshToken() async {
try {
final response = await _authService.refreshToken();
if (response.success && response.data != null && response.data!.user != null) {
_user = UserModel.fromJson(response.data!.user!);
if (_state != AuthState.authenticated) {
_setState(AuthState.authenticated);
}
return true;
} else {
// Token刷新失败需要重新登录
_user = null;
_setState(AuthState.unauthenticated);
return false;
}
} catch (e) {
_user = null;
_setState(AuthState.unauthenticated);
return false;
}
}
/// 设置加载状态
void _setLoading(bool loading) {
_isLoading = loading;
notifyListeners();
}
/// 设置状态
void _setState(AuthState state) {
_state = state;
notifyListeners();
}
/// 设置错误信息
void _setError(String message) {
_errorMessage = message;
_setState(AuthState.error);
}
/// 清除错误信息
void _clearError() {
_errorMessage = null;
if (_state == AuthState.error) {
_setState(_user != null ? AuthState.authenticated : AuthState.unauthenticated);
}
}
/// 清除所有状态
void clear() {
_user = null;
_errorMessage = null;
_isLoading = false;
_setState(AuthState.initial);
}
}