优化刷新逻辑和 开始作业面板的缓存逻辑

This commit is contained in:
mmc
2026-03-14 19:13:47 +08:00
parent 84d4ad6003
commit ca511e5729

View File

@@ -171,8 +171,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
super.initState();
_currentStation = _stationList.first;
_traceManager = TracePoint<PlotPoint>();
_initLocationEnterprise();
// 新增:加载本地存储的绘制数据
_loadSavedData();
// 示例:切换到导航模式
@@ -294,11 +293,11 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// 1. 恢复作业面板状态
_isWorkPanelOpen = prefs.getBool(kSavedIsWorkPanelOpen) ?? false;
if (isStartWork && !isStopWork) {
_isWorkPanelOpen = true;
} else {
_isWorkPanelOpen = false;
}
// if (isStartWork && !isStopWork) {
// _isWorkPanelOpen = true;
// } else {
// _isWorkPanelOpen = false;
// }
// 2. 恢复作业模式
workMode = prefs.getString(kSavedWorkMode) ?? "弓字模式";
@@ -444,42 +443,74 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
return lat != 0 && lng != 0 && lat >= -90 && lat <= 90 && lng >= -180 && lng <= 180;
}
void _onDeviceData(double lng, double lat, bool obfFlag, int headingStatus, controlMode) {
void _onDeviceData(double lng, double lat, bool obfFlag, int headingStatus, dynamic controlMode) {
try {
// 1. 校验坐标有效性
if (!_isValidLatLng(lat, lng)) {
debugPrint('坐标无效:纬度=$lat, 经度=$lng,跳过处理');
return;
// 1. 校验坐标是否有效
bool isValid = _isValidLatLng(lat, lng);
// ==============================================
// 🔥 关键:无效坐标只打印,不 return,不断流
// ==============================================
if (!isValid) {
debugPrint('[定位] 坐标无效:lat=$lat, lng=$lng → 跳过本次定位更新');
// 不写 return!!!
}
if (isStartWork && headingStatus == 0 && !isStopWork) {
if (!_showHeadingWarn) {
// 仅状态变化时更新,避免重复刷新
setState(() => _showHeadingWarn = true);
// ==============================================
// 2. 航向角提示(不受坐标影响,必须执行)
// ==============================================
if (isStartWork && !isStopWork) {
if (headingStatus == 0) {
if (!_showHeadingWarn) {
setState(() {
_showHeadingWarn = true;
});
}
} else {
if (_showHeadingWarn) {
setState(() {
_showHeadingWarn = false;
});
}
}
return;
} else if (isStartWork && headingStatus == 1 && _showHeadingWarn && !isStopWork) {
// 条件不满足时隐藏提示
setState(() => _showHeadingWarn = false);
}
if (isStartWork && controlMode != "3" && !isStopWork) {
if (!_showControlModeWarn) {
// 仅状态变化时更新
setState(() => _showControlModeWarn = true);
// ==============================================
// 3. 远程模式提示(不受坐标影响,必须执行)
// ==============================================
String mode = controlMode?.toString() ?? "";
if (mode != "3") {
if (!_showControlModeWarn) {
setState(() {
_showControlModeWarn = true;
});
}
} else {
if (_showControlModeWarn) {
setState(() {
_showControlModeWarn = false;
});
}
}
} else {
// 未作业 → 自动隐藏所有警告
if (_showHeadingWarn || _showControlModeWarn) {
setState(() {
_showHeadingWarn = false;
_showControlModeWarn = false;
});
}
} else if (isStartWork && controlMode == "3" && _showControlModeWarn && !isStopWork) {
// 条件不满足时隐藏提示
setState(() => _showControlModeWarn = false);
}
//if (isStartWork && obfFlag) {
// ObsToastWidget.show(context: context, message: "小迈提醒您前方有障碍物哦!");
//} else {
// ObsToastWidget.dismiss();
//}
// ==============================================
// 4. 障碍物提示(可选,你自己开关)
// ==============================================
// if (isStartWork && obfFlag) {
// ObsToastWidget.show(context: context, message: "小迈提醒您前方有障碍物哦!");
// } else {
// ObsToastWidget.dismiss();
// }
} catch (e) {
debugPrint('处理经纬度数据失败:$e');
debugPrint('[定位] 处理设备数据异常:$e');
}
}
@@ -806,6 +837,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// ========== 新增:页面刷新初始化方法 ==========
Future<void> _handleRefresh() async {
debugPrint("点击刷新");
// 防止重复刷新
if (_isRefreshing) return;
// 🔥 修复1:保存当前有效的地图中心和缩放级别(而非定位坐标)
@@ -813,13 +845,14 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
setState(() {
_isRefreshing = true; // 标记开始刷新
});
debugPrint("点击刷新111");
try {
if (_currentLatLng != null && _isValidLatLng(_currentLatLng!.latitude, _currentLatLng!.longitude)) {
_mapController.move(_currentLatLng!, 18);
} else {
_mapController.move(_currentLatLng!, 18);
debugPrint("点击刷新333");
}
debugPrint("点击刷新2222");
// 2. 重置所有页面状态(恢复初始值)
setState(() {
_traceManager.setMode(TPMode.LOCATION);
@@ -928,8 +961,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
} else {
_obstacleHoles.add(List.from(_currentObstaclePoints));
}
_currentObstaclePoints.clear(); // 清空当前绘制的障碍物点
_robotModeObsWgsPoints.clear(); // 清空Robot模式下的障碍物WGS84坐标
_isObstacleEditing = false; // 退出编辑状态
});
_saveDataToLocal();
@@ -939,6 +971,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
// ========== 核心方法:打点逻辑 ==========
void _addMarkedPoint() {
_traceManager.reset();
if (_currentAreaMode == AreaMode.work && _isWorkAreaCompleted) {
ToastUtils.showError(context, '作业区域已完成,无法继续添加打点!');
return;
@@ -1155,6 +1188,8 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
_isWorkPanelOpen = true;
_isPanelOpen = false;
});
} finally {
_saveDataToLocal();
}
},
child: Container(
@@ -2098,6 +2133,8 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
setState(() {
_isWorkAreaCompleted = true;
_saveBoxOpen = true;
_currentObstaclePoints.clear(); // 清空当前绘制的障碍物点
_robotModeObsWgsPoints.clear(); // 清空Robot模式下的障碍物WGS84坐标
final pathList = cubitState.generatedPath as List;
typedPathList = pathList.whereType<work_area_model.DeviceAddPathPointModel>().toList();
gcjPathPoints = typedPathList.map((point) {
@@ -2301,7 +2338,6 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
onPressed: _moveToCurrentLocation,
child: VerticalFloatMenu(
onEditTap: (bool isOpen) {
_traceManager.reset();
setState(() {
_isPanelOpen = isOpen;
});
@@ -2316,6 +2352,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
_isListBoxOpen = isOpen;
_isWorkPanelOpen = false;
});
_saveDataToLocal();
},
onDjShow: (bool isOpen) {
if (isOpen) context.go(RoutePaths.djMap);