修复每次 登录之后 首页显示设备是 上一次登录的设备的问题
This commit is contained in:
@@ -1,3 +1,4 @@
|
||||
import 'dart:async';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
import 'package:get_it/get_it.dart';
|
||||
@@ -5,6 +6,7 @@ import 'package:maibu_satabot_v2/core/app/app_user_cubit.dart';
|
||||
import 'package:maibu_satabot_v2/core/consts/tcp_consts.dart';
|
||||
import 'package:maibu_satabot_v2/core/network/tcp/tcp_client.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 '../../../devices/domain/entities/device_entity.dart';
|
||||
import '../widgets/ImmersionHeader.dart';
|
||||
@@ -19,75 +21,53 @@ class HomePage extends StatefulWidget {
|
||||
}
|
||||
|
||||
class _HomePageState extends State<HomePage> {
|
||||
bool _isInitializing = false; // 标记是否正在初始化
|
||||
bool _hasLoadedDevices = false; // 标记是否已加载过设备列表
|
||||
bool _isInitializing = false;
|
||||
bool _isDevicesLoading = true; // 👈 新加:设备加载中状态
|
||||
bool _hasLoadedDevices = false;
|
||||
|
||||
/// 🔥 核心方法:页面显示前的初始化操作
|
||||
/// 🔥 修复:等待设备加载完成,再执行后续逻辑
|
||||
Future<void> _initializePage() async {
|
||||
if (_isInitializing) {
|
||||
debugPrint('[HomePage] 正在初始化,跳过重复调用');
|
||||
return;
|
||||
}
|
||||
|
||||
if (_isInitializing) return;
|
||||
_isInitializing = true;
|
||||
|
||||
try {
|
||||
final userState = context.read<AppUserCubit>().state;
|
||||
final String? username = userState.user?.username;
|
||||
|
||||
final username = context.read<AppUserCubit>().state.user?.username;
|
||||
if (username == null || username.isEmpty) {
|
||||
debugPrint('[HomePage] 用户未登录,跳过初始化');
|
||||
setState(() => _isDevicesLoading = false);
|
||||
return;
|
||||
}
|
||||
|
||||
final devicesCubit = context.read<DevicesCubit>();
|
||||
|
||||
// 🔥 步骤 1: 先检查设备列表是否需要刷新
|
||||
if (!_hasLoadedDevices && (devicesCubit.state.devices == null || devicesCubit.state.devices!.isEmpty)) {
|
||||
debugPrint('[HomePage] 设备列表为空,触发获取...');
|
||||
|
||||
// ❌ 不要 await,让它后台执行
|
||||
devicesCubit.fetchAllDevices(username);
|
||||
|
||||
// 🔥 等待一小段时间让数据过来
|
||||
// await Future.delayed(const Duration(milliseconds: 500));
|
||||
// 🔥 关键:等待设备加载完成
|
||||
await devicesCubit.fetchAllDevices(username);
|
||||
|
||||
// 🔥 加载完成!关闭 loading
|
||||
setState(() {
|
||||
_isDevicesLoading = false;
|
||||
_hasLoadedDevices = true;
|
||||
}
|
||||
|
||||
// 🔥 步骤 2: 获取最新设备列表
|
||||
final deviceState = devicesCubit.state;
|
||||
final List<DeviceEntity> deviceList = deviceState.devices ?? [];
|
||||
});
|
||||
|
||||
// 🔥 现在再拿设备列表 = 最新的,绝对不是旧的!
|
||||
final deviceList = devicesCubit.state.devices ?? [];
|
||||
if (deviceList.isNotEmpty) {
|
||||
// 🔥 步骤 3: TCP 连接(异步执行,不阻塞 UI)
|
||||
final firstDevice = deviceState.selectedDevice ?? deviceList.first;
|
||||
debugPrint('🔌 [HomePage] 准备连接设备:${firstDevice.deviceName}');
|
||||
final firstDevice = deviceList.first;
|
||||
|
||||
// 🔥 自动选中第一个设备(保证是最新的)
|
||||
devicesCubit.selectDevice(firstDevice);
|
||||
|
||||
// 连接 TCP
|
||||
final tcpClient = GetIt.instance<TcpClient>();
|
||||
var bool = tcpClient.isConnected;
|
||||
debugPrint('tcpClient,$bool');
|
||||
if (!tcpClient.isConnected) {
|
||||
// ❌ 异步执行,不阻塞
|
||||
tcpClient.connectBySwitch(
|
||||
host: TCPConsts.TCP_IP,
|
||||
port: TCPConsts.TCP_PORT,
|
||||
deviceName: firstDevice.deviceName
|
||||
).then((_) {
|
||||
tcpClient.connectBySwitch(host: TCPConsts.TCP_IP, port: TCPConsts.TCP_PORT, deviceName: firstDevice.deviceName).then((_) {
|
||||
debugPrint('✅ [HomePage] TCP 连接成功');
|
||||
tcpClient.startHeartbeat(interval: const Duration(seconds: 4));
|
||||
}).catchError((e) {
|
||||
debugPrint('❌ [HomePage] TCP 连接失败:$e');
|
||||
});
|
||||
} else {
|
||||
debugPrint('✅ [HomePage] TCP 已连接');
|
||||
}
|
||||
} else {
|
||||
debugPrint('⚠️ [HomePage] 设备列表仍为空');
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
debugPrint('❌ [HomePage] 初始化异常:$e');
|
||||
setState(() => _isDevicesLoading = false);
|
||||
debugPrint('初始化异常:$e');
|
||||
} finally {
|
||||
_isInitializing = false;
|
||||
}
|
||||
@@ -96,10 +76,6 @@ class _HomePageState extends State<HomePage> {
|
||||
@override
|
||||
void initState() {
|
||||
super.initState();
|
||||
debugPrint('📄 [HomePage] initState - 页面开始初始化');
|
||||
|
||||
// 🔥 关键:在页面显示之前执行初始化
|
||||
// 使用 addPostFrameCallback 确保 build 完成后立即执行
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
_initializePage();
|
||||
});
|
||||
@@ -107,48 +83,25 @@ class _HomePageState extends State<HomePage> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
debugPrint('🎨 [HomePage] build - 渲染 UI');
|
||||
|
||||
// 同时监听用户和设备状态
|
||||
final userState = context.watch<AppUserCubit>().state;
|
||||
final deviceState = context.watch<DevicesCubit>().state;
|
||||
final currentDevice = deviceState.selectedDevice;
|
||||
|
||||
final defaultDevice = DeviceEntity(
|
||||
deviceName: '暂未绑定设备',
|
||||
productId: 00000,
|
||||
productName: '',
|
||||
tenantId: 00000,
|
||||
tenantName: ''
|
||||
);
|
||||
|
||||
// 如果没有绑定设备,展示未绑定设备的提示页面
|
||||
if (currentDevice == null) {
|
||||
debugPrint('ℹ️ [HomePage] 无选中设备,显示默认设备');
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFFF7F7F7),
|
||||
body: CustomScrollView(
|
||||
physics: const BouncingScrollPhysics(),
|
||||
slivers: [
|
||||
SliverToBoxAdapter(child: ImmersionHeader(device: defaultDevice)),
|
||||
const SliverToBoxAdapter(child: QuickActionsGrid()),
|
||||
const SliverToBoxAdapter(child: WorkParamsCard()),
|
||||
const SliverToBoxAdapter(child: SizedBox(height: 120)),
|
||||
],
|
||||
),
|
||||
);
|
||||
// 🔥 加载中 → 显示 Loading
|
||||
if (_isDevicesLoading) {
|
||||
return const Scaffold(body: Center(child: CircularProgressIndicator()));
|
||||
}
|
||||
|
||||
// 如果有绑定设备,正常展示页面
|
||||
debugPrint('✅ [HomePage] 有选中设备:${currentDevice.deviceName}');
|
||||
// 🔥 现在取的设备 = 100% 最新加载完成的
|
||||
final currentDevice = deviceState.selectedDevice;
|
||||
|
||||
final defaultDevice = DeviceEntity(deviceName: '暂未绑定设备', productId: 00000, productName: '', tenantId: 00000, tenantName: '');
|
||||
|
||||
return Scaffold(
|
||||
backgroundColor: const Color(0xFFF7F7F7),
|
||||
body: CustomScrollView(
|
||||
physics: const BouncingScrollPhysics(),
|
||||
slivers: [
|
||||
SliverToBoxAdapter(child: ImmersionHeader(device: currentDevice)),
|
||||
SliverToBoxAdapter(child: ImmersionHeader(device: currentDevice ?? defaultDevice)),
|
||||
const SliverToBoxAdapter(child: QuickActionsGrid()),
|
||||
SliverToBoxAdapter(child: WorkParamsCard()),
|
||||
const SliverToBoxAdapter(child: SizedBox(height: 120)),
|
||||
@@ -159,7 +112,6 @@ class _HomePageState extends State<HomePage> {
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
debugPrint('🗑️ [HomePage] dispose - 页面销毁');
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user