重构机器状态页面的数据获取设定保证数据及时显示
This commit is contained in:
@@ -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 ======================
|
||||
|
||||
@@ -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(),
|
||||
),
|
||||
),
|
||||
|
||||
Reference in New Issue
Block a user