解决了渲染TCP推送数据,在切换功能后不稳定问题,保证了APP端的稳定性。
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user