补充重构机器状态页面的数据获取设定保证数据及时显示
This commit is contained in:
103
lib/features/devices/presentation/bloc/device_status_cubit.dart
Normal file
103
lib/features/devices/presentation/bloc/device_status_cubit.dart
Normal 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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user