补充重构机器状态页面的数据获取设定保证数据及时显示

This commit is contained in:
2026-04-17 17:30:20 +08:00
parent b116e4bed3
commit 3b1751f981

View File

@@ -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<DeviceStatusState> {
final NetMessageDispatcher _dispatcher;
final ILoggerService _logger = GetIt.I<ILoggerService>();
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<void> close() {
debugPrint('🚫 [DeviceStatusCubit] 关闭,取消订阅');
_stringMessageSub?.cancel();
return super.close();
}
}