解决了渲染TCP推送数据,在切换功能后不稳定问题,保证了APP端的稳定性。

This commit is contained in:
2026-04-22 15:16:30 +08:00
parent 0402d2f3f5
commit e8a23559d4
9 changed files with 179 additions and 85 deletions

View File

@@ -7,6 +7,8 @@ import 'package:maibu_satabot_v2/core/router/route_paths.dart';
import 'package:maibu_satabot_v2/features/devices/domain/entities/device_entity.dart';
import 'package:maibu_satabot_v2/features/devices/presentation/bloc/devices_cubit.dart';
import 'package:maibu_satabot_v2/features/devices/presentation/bloc/devices_state.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';
class MachineDetailsPage extends StatefulWidget {
final DeviceEntity? device;
@@ -26,6 +28,10 @@ class _MachineDetailsPageState extends State<MachineDetailsPage> {
BuildContext? _loadingDialogContext; // 解绑加载弹窗
BuildContext? _updateLoadingContext; // 修改名称加载弹窗
bool _isUpdatingName = false;
// 🔥 保存 stream 引用,避免每次 rebuild 都重新获取
late Stream<DeviceStatusState> _deviceStatusStream;
late DeviceStatusState _initialState;
@override
void initState() {
@@ -33,6 +39,12 @@ class _MachineDetailsPageState extends State<MachineDetailsPage> {
_deviceName = (widget.device?.deviceAlias?.trim().isEmpty ?? true) ? '未知设备' : widget.device!.deviceAlias!;
_deviceId = widget.device?.deviceName ?? '';
_nameController = TextEditingController(text: _deviceName);
// 🔥 在 initState 中保存 stream 和 initial state
final bloc = context.read<DeviceStatusBloc>();
_deviceStatusStream = bloc.stream;
_initialState = bloc.state;
debugPrint('📦 [MachineDetails] initState - 初始状态: ${_initialState.runtimeType}');
}
@override
@@ -188,6 +200,9 @@ class _MachineDetailsPageState extends State<MachineDetailsPage> {
children: [
_buildDeviceStatusCard(currentDevice),
const SizedBox(height: 16),
// 🔥 新增:实时状态卡片
_buildRealTimeStatusCard(),
const SizedBox(height: 16),
_buildBasicInfoCard(context, currentDevice),
const SizedBox(height: 16),
_buildResourceCenterCard(),
@@ -200,6 +215,64 @@ class _MachineDetailsPageState extends State<MachineDetailsPage> {
);
}
/// 🔥 新增:实时状态卡片(显示控制模式、电压、电量)
Widget _buildRealTimeStatusCard() {
return StreamBuilder<DeviceStatusState>(
stream: _deviceStatusStream,
initialData: _initialState,
builder: (context, snapshot) {
final blocState = snapshot.data;
debugPrint('🔍 [MachineDetails] StreamBuilder 收到状态: ${blocState?.runtimeType}');
String controlMode = '未知';
String voltage = '--';
String battery = '--';
if (blocState is DeviceStatusUpdated) {
debugPrint('✅ [MachineDetails] 有实时数据 - 电压:${blocState.status.voltage}, 电量:${blocState.status.battery}');
controlMode = blocState.status.controlMode == '3' ? '远程模式' : '本地模式';
voltage = '${blocState.status.voltage}V';
battery = '${blocState.status.battery}%';
} else {
debugPrint('⚠️ [MachineDetails] 没有实时数据,状态类型: ${blocState?.runtimeType}');
}
return Container(
padding: const EdgeInsets.all(16),
decoration: BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.circular(12),
boxShadow: [BoxShadow(color: Colors.grey.withOpacity(0.1), blurRadius: 8, offset: const Offset(0, 2))],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const Padding(
padding: EdgeInsets.only(bottom: 12),
child: Text('实时状态', style: TextStyle(fontSize: 14, color: Color(0xFF999999))),
),
_buildStatusRow('控制模式', controlMode),
const Divider(height: 24, color: Color(0xFFF0F0F0)),
_buildStatusRow('电池电压', voltage),
const Divider(height: 24, color: Color(0xFFF0F0F0)),
_buildStatusRow('剩余电量', battery),
],
),
);
},
);
}
Widget _buildStatusRow(String label, String value) {
return Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(label, style: const TextStyle(fontSize: 16, color: Color(0xFF333333))),
Text(value, style: const TextStyle(fontSize: 16, fontWeight: FontWeight.w600, color: Color(0xFF007AFF))),
],
);
}
/// 设备状态卡片(保持不变)
Widget _buildDeviceStatusCard(DeviceEntity device) {
return Container(