diff --git a/lib/features/devices/presentation/bloc/device_status_cubit.dart b/lib/features/devices/presentation/bloc/device_status_cubit.dart new file mode 100644 index 00000000..93c6d238 --- /dev/null +++ b/lib/features/devices/presentation/bloc/device_status_cubit.dart @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + +import 'dart:async'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:get_it/get_it.dart'; +import 'package:maibu_satabot_v2/features/devices/domain/entities/running_status_entity.dart'; +import 'package:maibu_satabot_v2/features/devices/domain/entities/gps_entity.dart'; + +import '../../../../core/logging/i_logger_service.dart'; +import '../../../../core/network/net_message_dispatcher.dart'; +import 'device_status_state.dart'; + +/// 🔥 简化版:直接照搬 RemoteControlCubit 模式,不用 BLoC 事件机制 +class DeviceStatusCubit extends Cubit { + final NetMessageDispatcher _dispatcher; + final ILoggerService _logger = GetIt.I(); + StreamSubscription? _stringMessageSub; + + DeviceStatusCubit(this._dispatcher) : super(DeviceStatusInitial()) { + _initStringMessageListener(); + } + + void _initStringMessageListener() { + debugPrint('🔗 [DeviceStatusCubit] 初始化 0x02 监听器'); + _logger.log('🔗 [DeviceStatusCubit] 初始化 0x02 监听器'); + + _stringMessageSub?.cancel(); + + _stringMessageSub = _dispatcher.onStringMessage().listen((message) { + if (message.isEmpty) { + return; + } + + try { + final fields = message.trim().split(','); + + if (fields.length < 18) { + debugPrint('⚠️ [DeviceStatusCubit] 字段不足:${fields.length}'); + if (!isClosed) { + emit(DeviceStatusError('字段不足,期望≥18,实际:${fields.length}')); + } + return; + } + + final status = RunningStatusEntity.fromFields(fields); + final gps = GPSEntity(status.latitude, status.longitude); + + //debugPrint('✅ [DeviceStatusCubit] 解析成功:Lat=${gps.latitude}, Lng=${gps.longitude}'); + + if (!isClosed) { + emit(DeviceStatusUpdated(status, gps)); + } + } catch (e) { + debugPrint('❌ [DeviceStatusCubit] 解析异常:$e'); + _logger.log('❌ [DeviceStatusCubit] 解析异常:$e'); + if (!isClosed) { + emit(DeviceStatusError('解析失败:$e')); + } + } + }); + + debugPrint('✅ [DeviceStatusCubit] 监听器已建立'); + _logger.log('✅ [DeviceStatusCubit] 监听器已建立'); + } + + void reset() { + debugPrint('🔄 [DeviceStatusCubit] 重置状态'); + emit(DeviceStatusInitial()); + } + + @override + Future close() { + debugPrint('🚫 [DeviceStatusCubit] 关闭,取消订阅'); + _stringMessageSub?.cancel(); + return super.close(); + } +}