解决了渲染TCP推送数据,在切换功能后不稳定问题,保证了APP端的稳定性。
This commit is contained in:
@@ -7,6 +7,8 @@ import 'package:flutter/cupertino.dart';
|
||||
import 'package:flutter/services.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
import 'package:maibu_satabot_v2/features/devices/presentation/bloc/device_status_bloc.dart';
|
||||
import 'package:maibu_satabot_v2/features/devices/presentation/bloc/device_status_state.dart';
|
||||
import 'package:maibu_satabot_v2/features/remote_control/data/models/running_status_model.dart';
|
||||
import 'package:maibu_satabot_v2/features/remote_control/presentation/bloc/remote_control_state.dart';
|
||||
|
||||
@@ -23,7 +25,8 @@ class RemoteControlCubit extends Cubit<RemoteControlState> {
|
||||
Timer? _timer;
|
||||
StreamSubscription? _kickOutSub; // 新增:用于管理监听生命周期
|
||||
final NetMessageDispatcher dispatcher;
|
||||
StreamSubscription? _stringMessageSub; //
|
||||
final DeviceStatusBloc deviceStatusBloc; // 🔥 注入 DeviceStatusBloc
|
||||
StreamSubscription? _deviceStatusSub; // 🔥 订阅 DeviceStatusBloc 的状态流
|
||||
static const platform = MethodChannel('com.maibu.satabot/ping');
|
||||
int _currentPing = 50;
|
||||
final ILoggerService _logger = GetIt.I<ILoggerService>();
|
||||
@@ -34,77 +37,48 @@ class RemoteControlCubit extends Cubit<RemoteControlState> {
|
||||
|
||||
|
||||
|
||||
RemoteControlCubit(this._repository, this._requestControlPermissionUseCase, this.dispatcher)
|
||||
: super(
|
||||
RemoteControlCubit(
|
||||
this._repository,
|
||||
this._requestControlPermissionUseCase,
|
||||
this.dispatcher,
|
||||
this.deviceStatusBloc, // 🔥 注入
|
||||
) : super(
|
||||
RemoteControlState(
|
||||
controlEntity: MachineControlStatusEntity(),
|
||||
runningStatusModel: RunningStatusModel(),
|
||||
),
|
||||
) {
|
||||
_initPacketListener();
|
||||
_initStringMessageListener(); // 🔥 新增
|
||||
_initDeviceStatusListener(); // 🔥 改为订阅 DeviceStatusBloc
|
||||
}
|
||||
|
||||
void _initStringMessageListener() {
|
||||
//print('>>> [RemoteControl] begin 初始化 0x02 字符串监听器');
|
||||
_logger.logWithLevel('>>> [RemoteControl] begin 初始化 0x02 字符串监听器');
|
||||
_stringMessageSub?.cancel();
|
||||
// 🔥 新增:订阅 DeviceStatusBloc 的状态流,而不是直接监听 TCP
|
||||
void _initDeviceStatusListener() {
|
||||
_logger.logWithLevel('>>> [RemoteControl] begin 订阅 DeviceStatusBloc 状态流');
|
||||
_deviceStatusSub?.cancel();
|
||||
|
||||
_stringMessageSub = dispatcher.onStringMessage().listen((message) async {
|
||||
// print('>>> [RemoteControl] 收到 0x02 字符串推送:$message');
|
||||
_logger.logWithLevel('>>> [RemoteControl] 收到 0x02 字符串推送:$message');
|
||||
_deviceStatusSub = deviceStatusBloc.stream.listen((deviceState) async {
|
||||
if (deviceState is DeviceStatusUpdated) {
|
||||
final voltage = deviceState.status.voltage;
|
||||
final battery = deviceState.status.battery;
|
||||
final controlMode = deviceState.status.controlMode == '3' ? '远程模式' : '本地模式';
|
||||
|
||||
if (message.isEmpty) {
|
||||
//print('⚠️ [RemoteControl] 消息为空,跳过解析');
|
||||
_logger.logWithLevel('⚠️ [RemoteControl] 消息为为空,跳过解析');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
// 🔥 关键:使用与 DeviceStatusBloc 相同的解析方法
|
||||
// print('>>> [RemoteControl] 🔍 开始解析数据(使用 fromFields)...');
|
||||
_logger.logWithLevel('>>> [RemoteControl] 🔍 开始解析数据(使用 fromFields)...');
|
||||
|
||||
final fields = message.trim().split(',');
|
||||
//print('>>> [RemoteControl] 字段数量:${fields.length}');
|
||||
_logger.logWithLevel('>>> [RemoteControl] 字段数量:${fields.length}');
|
||||
|
||||
if (fields.length < 18) {
|
||||
//print('⚠️ [RemoteControl] 字段不足:${fields.length},期望 ≥18');
|
||||
_logger.logWithLevel('⚠️ [RemoteControl] 字段不足:${fields.length},期望 ≥18');
|
||||
return;
|
||||
}
|
||||
|
||||
// 🔥 使用 RunningStatusEntity.fromFields() 解析
|
||||
final status = RunningStatusEntity.fromFields(fields);
|
||||
// 🔥 只提取电压、电量、控制模式
|
||||
final voltage = status.voltage;
|
||||
final battery = status.battery;
|
||||
final controlMode = status.controlMode == '3' ? '远程模式' : '本地模式';
|
||||
|
||||
|
||||
final c = getNetworkDelay(); //
|
||||
final c = getNetworkDelay();
|
||||
emit(state.copyWith(
|
||||
runningStatusModel: state.runningStatusModel.copyWith(
|
||||
voltage: voltage.toString(), // 更新电压
|
||||
battery: battery.toString(), // 更新电量
|
||||
controlMode: controlMode, // 更新控制模式
|
||||
voltage: voltage.toString(),
|
||||
battery: battery.toString(),
|
||||
controlMode: controlMode,
|
||||
),
|
||||
battery: int.tryParse(battery) ?? 0,
|
||||
ping: await c, // 这里直接使用异步返回的数值
|
||||
ping: await c,
|
||||
));
|
||||
|
||||
|
||||
} catch (e, stackTrace) {
|
||||
// print('>>> [RemoteControl] ❌ 解析失败:$e');
|
||||
_logger.logWithLevel('>>> [RemoteControl] ❌ 解析失败:$e');
|
||||
// print('>>> [RemoteControl] ❌ 堆栈跟踪:$stackTrace');
|
||||
// print('>>> [RemoteControl] ❌ 原始消息:$message');
|
||||
_logger.logWithLevel('✅ [RemoteControl] 从 DeviceStatusBloc 收到更新: 电压=$voltage, 电量=$battery, 模式=$controlMode');
|
||||
}
|
||||
});
|
||||
|
||||
//print('>>> [RemoteControl] ✅ 0x02 字符串监听器已建立完成');
|
||||
_logger.logWithLevel('>>> [RemoteControl] ✅ 0x02 字符串监听器已建立完成');
|
||||
_logger.logWithLevel('>>> [RemoteControl] ✅ DeviceStatusBloc 订阅已建立完成');
|
||||
}
|
||||
|
||||
|
||||
@@ -426,9 +400,8 @@ class RemoteControlCubit extends Cubit<RemoteControlState> {
|
||||
|
||||
@override
|
||||
Future<void> close() {
|
||||
_timer?.cancel(); // 退出页面时务必销毁定时器
|
||||
_kickOutSub?.cancel();
|
||||
_stringMessageSub?.cancel();
|
||||
_timer?.cancel();
|
||||
_deviceStatusSub?.cancel(); // 🔥 取消订阅 DeviceStatusBloc
|
||||
return super.close();
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user