Files
flutterApp/lib/features/auth/presentation/bloc/auth_cubit.dart
2026-01-27 18:44:49 +08:00

77 lines
2.2 KiB
Dart

import 'dart:async';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:maibu_satabot_v2/core/network/enums/control_mode.dart'; // 引入
import 'package:maibu_satabot_v2/core/network/tcp/tcp_connection.dart';
import '../../../../core/di/injection.dart';
import '../../../../core/protocol/protocol_constants.dart';
import '../../../connectivity/presentation/bloc/connectivity_cubit.dart';
import '../../domain/entities/user_entity.dart';
import 'app_user_cubit.dart';
import '../../data/datasources/i_auth_local_datasource.dart';
import 'auth_state.dart';
class AuthCubit extends Cubit<AuthState> {
final IAuthLocalDataSource storage;
final AppUserCubit appCubit;
final ConnectivityCubit connectivityCubit;
StreamSubscription? _eventSub;
AuthCubit({
required this.storage,
required this.appCubit,
required this.connectivityCubit,
}) : super(AuthInitial()) {
_listenToAuthResponse();
}
Future<void> appStarted() async {
final user = await storage.getUser();
if (user != null) {
_connectTcp();
appCubit.setAuth(user);
emit(AuthAuthenticated(user));
} else {
emit(AuthUnauthenticated());
}
}
Future<void> loginSuccess(UserEntity user) async {
await storage.saveUser(user);
_connectTcp();
appCubit.setAuth(user);
emit(AuthAuthenticated(user));
}
void _connectTcp() {
// 动态注入 TCP 连接
final tcp = sl<TcpConnection>();
connectivityCubit.setConnection(tcp, ControlMode.TCP);
}
Future<void> logout() async {
await storage.deleteUser();
// 现在 setConnection 接受 null 了,不会再爆红
connectivityCubit.setConnection(null, ControlMode.NONE);
appCubit.clearAuth();
emit(AuthUnauthenticated());
}
void _listenToAuthResponse() {
_eventSub?.cancel();
// 监听全局解析后的 Packet 流
_eventSub = connectivityCubit.activePacketStream
.where((packet) => packet.cmdType == ProtocolConstants.cmdGetAuth)
.listen((packet) {
// 这里处理 0x04 授权逻辑
print("Auth Response Received: ${packet.payload}");
});
}
@override
Future<void> close() {
_eventSub?.cancel();
return super.close();
}
}