77 lines
2.2 KiB
Dart
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();
|
|
}
|
|
} |