地图显示缓存逻辑
This commit is contained in:
@@ -41,12 +41,20 @@ import 'package:maibu_satabot_v2/features/home/presentation/widgets/obsToast.dar
|
||||
import 'package:maibu_satabot_v2/features/home/presentation/widgets/startpoint_area.dart';
|
||||
import 'package:image/image.dart' as _image; // 注意命名空间冲突,使用 as img
|
||||
import 'package:maibu_satabot_v2/features/home/presentation/widgets/video.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
import 'dart:ui' as ui;
|
||||
|
||||
import '../path_list_pages.dart';
|
||||
|
||||
// 定义轨迹点类型(经纬度)
|
||||
typedef PlotPoint = LatLng;
|
||||
// 本地存储Key常量
|
||||
const String kSavedPlotData = 'saved_plot_data';
|
||||
const String kSavedGcjPathPoints = 'saved_gcj_path_points';
|
||||
const String kSavedGcjOuterPoints = 'saved_gcj_outer_points';
|
||||
const String kSavedMarkedPoints = 'saved_marked_points';
|
||||
const String kSavedObstacleHoles = 'saved_obstacle_holes';
|
||||
const String kSavedIsWorkAreaCompleted = 'saved_is_work_area_completed';
|
||||
|
||||
// 保持 PlotData 类不变
|
||||
class PlotData {
|
||||
@@ -114,7 +122,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
List<PlotPoint>? gctracePoint = [];
|
||||
|
||||
// ========== 核心新增状态 ==========
|
||||
final List<LatLng> _markedPoints = []; // 存储所有s十字准星打点坐标
|
||||
List<LatLng> _markedPoints = []; // 存储所有s十字准星打点坐标
|
||||
List<LatLng> _robotModeWgsPoints = []; // Robot模式下从设备获取的wgs打点
|
||||
List<LatLng> _robotModeObsWgsPoints = []; // Robot模式下从设备获取的wgs打点 障碍物
|
||||
|
||||
@@ -153,6 +161,8 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
_currentStation = _stationList.first;
|
||||
_traceManager = TracePoint<PlotPoint>();
|
||||
_initLocationEnterprise();
|
||||
// 新增:加载本地存储的绘制数据
|
||||
_loadSavedData();
|
||||
|
||||
// 示例:切换到导航模式
|
||||
_traceManager.setMode(TPMode.LOCATION);
|
||||
@@ -175,6 +185,105 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
});
|
||||
}
|
||||
|
||||
// 新增:手动清除本地存储数据
|
||||
Future<void> _clearLocalData() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
prefs.remove(kSavedGcjPathPoints);
|
||||
prefs.remove(kSavedGcjOuterPoints);
|
||||
prefs.remove(kSavedMarkedPoints);
|
||||
prefs.remove(kSavedObstacleHoles);
|
||||
prefs.remove(kSavedIsWorkAreaCompleted);
|
||||
debugPrint('本地存储的绘制数据已清空');
|
||||
} catch (e) {
|
||||
debugPrint('清空本地数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:加载本地存储数据方法
|
||||
Future<void> _loadSavedData() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
// 加载路径点
|
||||
final pathJson = prefs.getString(kSavedGcjPathPoints);
|
||||
if (pathJson != null) {
|
||||
final List<dynamic> pathList = jsonDecode(pathJson);
|
||||
gcjPathPoints = pathList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList();
|
||||
}
|
||||
|
||||
// 加载外边界点
|
||||
final outerJson = prefs.getString(kSavedGcjOuterPoints);
|
||||
if (outerJson != null) {
|
||||
final List<dynamic> outerList = jsonDecode(outerJson);
|
||||
gcjOuterPoints = outerList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList();
|
||||
}
|
||||
|
||||
// 加载打点数据
|
||||
final markedJson = prefs.getString(kSavedMarkedPoints);
|
||||
if (markedJson != null) {
|
||||
final List<dynamic> markedList = jsonDecode(markedJson);
|
||||
_markedPoints = markedList.map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList().toList();
|
||||
}
|
||||
|
||||
// 加载障碍物数据
|
||||
final obstacleJson = prefs.getString(kSavedObstacleHoles);
|
||||
if (obstacleJson != null) {
|
||||
final List<dynamic> obstacleList = jsonDecode(obstacleJson);
|
||||
_obstacleHoles = obstacleList.map((hole) {
|
||||
return (hole as List<dynamic>).map((item) => LatLng(double.parse(item['lat'].toString()), double.parse(item['lng'].toString()))).toList();
|
||||
}).toList();
|
||||
}
|
||||
|
||||
// 加载作业区域完成状态
|
||||
_isWorkAreaCompleted = prefs.getBool(kSavedIsWorkAreaCompleted) ?? false;
|
||||
_saveBoxOpen = _isWorkAreaCompleted;
|
||||
|
||||
if (mounted) {
|
||||
setState(() {});
|
||||
// 移动地图到绘制内容中心
|
||||
List<LatLng> allPoints = [];
|
||||
allPoints.addAll(gcjPathPoints);
|
||||
allPoints.addAll(gcjOuterPoints);
|
||||
if (allPoints.isNotEmpty) {
|
||||
moveMapToPointsCenter(allPoints);
|
||||
}
|
||||
}
|
||||
} catch (e) {
|
||||
debugPrint('加载本地数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:保存绘制数据到本地
|
||||
Future<void> _saveDataToLocal() async {
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
|
||||
// 保存路径点
|
||||
final pathList = gcjPathPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList();
|
||||
prefs.setString(kSavedGcjPathPoints, jsonEncode(pathList));
|
||||
|
||||
// 保存外边界点
|
||||
final outerList = gcjOuterPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList();
|
||||
prefs.setString(kSavedGcjOuterPoints, jsonEncode(outerList));
|
||||
|
||||
// 保存打点数据
|
||||
final markedList = _markedPoints.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList();
|
||||
prefs.setString(kSavedMarkedPoints, jsonEncode(markedList));
|
||||
|
||||
// 保存障碍物数据
|
||||
final obstacleList = _obstacleHoles.map((hole) {
|
||||
return hole.map((point) => {'lat': point.latitude, 'lng': point.longitude}).toList();
|
||||
}).toList();
|
||||
prefs.setString(kSavedObstacleHoles, jsonEncode(obstacleList));
|
||||
|
||||
// 保存作业区域完成状态
|
||||
prefs.setBool(kSavedIsWorkAreaCompleted, _isWorkAreaCompleted);
|
||||
} catch (e) {
|
||||
debugPrint('保存本地数据失败:$e');
|
||||
}
|
||||
}
|
||||
|
||||
// ========== 新增:计算坐标列表的边界范围 ==========
|
||||
LatLngBounds? calculateBounds(List<LatLng> points) {
|
||||
if (points.isEmpty) return null;
|
||||
@@ -513,6 +622,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
ToastUtils.showInfo(context, '暂无障碍物可撤回');
|
||||
}
|
||||
});
|
||||
_saveDataToLocal();
|
||||
}
|
||||
|
||||
// ========== 统一删除方法(适配完成后状态) ==========
|
||||
@@ -559,6 +669,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
ToastUtils.showSuccess(context, '已清空所有障碍物');
|
||||
}
|
||||
});
|
||||
_saveDataToLocal();
|
||||
}
|
||||
|
||||
void _handleGotoLocation() {
|
||||
@@ -625,6 +736,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
|
||||
isDjMapShow = false;
|
||||
});
|
||||
_clearLocalData();
|
||||
|
||||
// 3. 重新初始化定位
|
||||
await _initLocationEnterprise();
|
||||
@@ -700,6 +812,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
_robotModeObsWgsPoints.clear(); // 清空Robot模式下的障碍物WGS84坐标
|
||||
_isObstacleEditing = false; // 退出编辑状态
|
||||
});
|
||||
_saveDataToLocal();
|
||||
|
||||
debugPrint('完成障碍物绘制,当前障碍物组数:${_obstacleHoles.length}');
|
||||
ToastUtils.showSuccess(context, '已添加第${_obstacleHoles.length}个障碍物区域');
|
||||
@@ -742,6 +855,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
}
|
||||
}
|
||||
});
|
||||
_saveDataToLocal();
|
||||
debugPrint('$_markedPoints,新增打点:第${_markedPoints.length}个点,经纬度:${_mapCenter.latitude.toStringAsFixed(20)}, ${_mapCenter.longitude.toStringAsFixed(20)}');
|
||||
}
|
||||
|
||||
@@ -1768,6 +1882,7 @@ class _MapPageEnterpriseState extends State<MapPageEnterprise> {
|
||||
// 外边界保持原有逻辑
|
||||
gcjOuterPoints = List.from(_markedPoints);
|
||||
});
|
||||
_saveDataToLocal();
|
||||
moveMapToPointsCenter(gcjPathPoints);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user