AGENTS.md 与 README.md 同步更新:根据实际代码结构重写目录树、技术栈、架构分层及编码规范,移除旧版内联示例并补充新的开发约定与代码生成命令。
57 lines
1.5 KiB
Dart
57 lines
1.5 KiB
Dart
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<AuthState> 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<bool> 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<void> 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));
|
||
}
|
||
}
|
||
}
|