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

This commit is contained in:
2026-04-17 17:29:31 +08:00
parent 06c54ef546
commit b116e4bed3
4 changed files with 163 additions and 70 deletions

View File

@@ -15,7 +15,7 @@ import '../../../../core/di/injection.dart';
import '../../../../core/network/net_message_dispatcher.dart';
import '../../../../core/network/protocol_decoder.dart';
import '../../../devices/presentation/bloc/devices_cubit.dart';
import '../../../devices/presentation/bloc/device_status_bloc.dart';
import '../../../devices/presentation/bloc/device_status_cubit.dart';
import '../../../devices/presentation/bloc/device_status_state.dart';
// 配置:数据超时时间(5秒)
@@ -28,7 +28,10 @@ class RunningStatusPage extends StatefulWidget {
State<RunningStatusPage> createState() => _RunningStatusPageState();
}
class _RunningStatusPageState extends State<RunningStatusPage> {
class _RunningStatusPageState extends State<RunningStatusPage> with WidgetsBindingObserver {
// 🔥 静态实例引用,用于生命周期回调
static _RunningStatusPageState? _instance;
bool _isCardView = true;
// 仪表盘/折线图切换状态
@@ -58,12 +61,31 @@ class _RunningStatusPageState extends State<RunningStatusPage> {
@override
void initState() {
super.initState();
// 初始化超时计时器
// 🔥 注册静态实例
_instance = this;
debugPrint('🚀 [RunningStatusPage] initState 被调用');
// 🔥 简化:直接重置状态,不需要重新初始化监听器
context.read<DeviceStatusCubit>().reset();
// 🔥 关键:立即启动超时计时器,如果5秒内没收到数据就显示"暂无数据"
_startDataTimeoutTimer();
// 🔥 新增:监听应用生命周期
WidgetsBinding.instance.addObserver(this);
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
debugPrint('🔄 [RunningStatusPage] 应用恢复,强制刷新UI');
_forceRefresh();
}
}
@override
void dispose() {
// 🔥 移除生命周期观察者
WidgetsBinding.instance.removeObserver(this);
_instance = null;
// 销毁计时器,防止内存泄漏
_dataTimeoutTimer?.cancel();
super.dispose();
@@ -819,7 +841,7 @@ class _RunningStatusPageState extends State<RunningStatusPage> {
body: CustomScrollView(
physics: const BouncingScrollPhysics(),
slivers: [
BlocBuilder<DeviceStatusBloc, DeviceStatusState>(
BlocBuilder<DeviceStatusCubit, DeviceStatusState>(
builder: (context, state) {
// 新增:超时状态下显示--
String qual = _isDataTimeout ? '--' : '--';
@@ -927,7 +949,7 @@ class _RunningStatusPageState extends State<RunningStatusPage> {
),
SliverToBoxAdapter(
child: BlocBuilder<DeviceStatusBloc, DeviceStatusState>(
child: BlocBuilder<DeviceStatusCubit, DeviceStatusState>(
builder: (context, state) {
debugPrint('🎨 [UI-Build] BlocBuilder 重建!当前状态类型:${state.runtimeType}');
@@ -942,6 +964,12 @@ class _RunningStatusPageState extends State<RunningStatusPage> {
if (!_isDataTimeout && state is DeviceStatusUpdated) {
debugPrint('📈 [UI] 检测到 Updated 状态,准备追加图表数据');
_appendChartData(state);
// 🔥 关键:收到数据后立即重置超时计时器
_startDataTimeoutTimer();
// 如果之前是超时状态,现在恢复
if (_isDataTimeout) {
setState(() => _isDataTimeout = false);
}
}
return Container(margin: const EdgeInsets.all(8), child: _isCardView ? _buildCardContentView(state) : _buildChartContentView(state));
},
@@ -992,6 +1020,18 @@ class _RunningStatusPageState extends State<RunningStatusPage> {
_voltageHistory.clear();
_timeIndex = 0;
}
// 🔥 新增:强制刷新UI(用于息屏恢复)
void _forceRefresh() {
if (mounted) {
debugPrint('🔄 [RunningStatusPage] 执行强制刷新');
setState(() {
// 触发 UI 重建
});
// 重置超时计时器
_startDataTimeoutTimer();
}
}
}
// ====================== 带动画的圆形仪表盘 Widget ======================

View File

@@ -7,7 +7,7 @@ import 'package:maibu_satabot_v2/features/home/presentation/pages/productDesc.da
import '../../../../core/di/injection.dart';
import '../../../../core/router/route_paths.dart';
import '../../../devices/presentation/bloc/device_status_bloc.dart';
import '../../../devices/presentation/bloc/device_status_cubit.dart';
import '../../../remote_control/presentation/bloc/remote_control_cubit.dart';
import '../../../remote_control/presentation/pages/remote_control_page.dart';
import '../pages/route_plan_page.dart';
@@ -33,7 +33,7 @@ class HomeRoutes {
path: RoutePaths.runningStatus,
// builder: (context, state) => const RunningStatusPage(),
builder: (context, state) => BlocProvider(
create: (_) => sl<DeviceStatusBloc>(), // 从 GetIt 获取单例
create: (_) => DeviceStatusCubit(sl()), // 使用简化版 Cubit
child: const RunningStatusPage(),
),
),