import 'package:riverpod_annotation/riverpod_annotation.dart'; import '../data/auth_providers.dart'; import '../domain/auth_repository.dart'; import '../domain/auth_state.dart'; part 'auth_controller.g.dart'; /// 登录状态控制器。 @Riverpod(keepAlive: true) class AuthController extends _$AuthController { AuthRepository get _repository => ref.read(authRepositoryProvider); @override FutureOr build() async { final repository = ref.watch(authRepositoryProvider); await repository.restore(); final loggedIn = repository.accessToken != null && await repository.hasRefreshToken(); return AuthState( loggedIn: loggedIn, restoring: false, username: await repository.getUsername(), ); } /// 登录:成功返回 true,失败返回 false 并写入错误信息。 Future login(String username, String password) async { try { await _repository.login(username, password); state = AsyncData( AuthState(loggedIn: true, username: username), ); return true; } catch (e) { state = AsyncData( AuthState(loggedIn: false, error: e.toString()), ); return false; } } /// 退出登录:清空令牌并复位状态。 Future logout() async { await _repository.clear(); state = const AsyncData(AuthState()); } /// 清空错误信息。 void clearError() { final current = state.valueOrNull; if (current != null && current.error != null) { state = AsyncData(current.copyWith(error: null)); } } }