From c85613998dd2f61c533e638b87538f71c5daea13 Mon Sep 17 00:00:00 2001 From: Kamiya Date: Thu, 14 Aug 2025 14:45:57 +0800 Subject: [PATCH] fix: manager refresh data when shown --- lib/app/map/_lib/managers/precipitation.dart | 23 +++++++++++++---- lib/app/map/_lib/managers/radar.dart | 26 ++++++++++++++------ lib/app/map/_lib/managers/report.dart | 19 +++++++++----- lib/app/map/_lib/managers/temperature.dart | 25 +++++++++++++------ lib/app/map/_lib/managers/wind.dart | 21 ++++++++++------ 5 files changed, 81 insertions(+), 33 deletions(-) diff --git a/lib/app/map/_lib/managers/precipitation.dart b/lib/app/map/_lib/managers/precipitation.dart index cbf3af2b4..b4eaaeaa8 100644 --- a/lib/app/map/_lib/managers/precipitation.dart +++ b/lib/app/map/_lib/managers/precipitation.dart @@ -53,6 +53,8 @@ class PrecipitationMapLayerManager extends MapLayerManager { final currentPrecipitationInterval = ValueNotifier('now'); final isLoading = ValueNotifier(false); + DateTime? _lastFetchTime; + Function(String)? onTimeChanged; Future setPrecipitationTime(String time) async { @@ -108,6 +110,19 @@ class PrecipitationMapLayerManager extends MapLayerManager { } } + Future _fetchData() async { + try { + final precipitationList = (await ExpTech().getRainList()).reversed.toList(); + if (!context.mounted) return; + + GlobalProviders.data.setPrecipitation(precipitationList); + currentPrecipitationTime.value ??= precipitationList.first; + _lastFetchTime = DateTime.now(); + } catch (e, s) { + TalkerManager.instance.error('PrecipitationMapLayerManager._fetchData', e, s); + } + } + @override Future setup() async { if (didSetup) return; @@ -116,11 +131,7 @@ class PrecipitationMapLayerManager extends MapLayerManager { try { if (GlobalProviders.data.precipitation.isEmpty) { - final precipitationList = (await ExpTech().getRainList()).reversed.toList(); - if (!context.mounted) return; - - GlobalProviders.data.setPrecipitation(precipitationList); - currentPrecipitationTime.value = precipitationList.first; + await _fetchData(); } final time = currentPrecipitationTime.value; @@ -276,6 +287,8 @@ class PrecipitationMapLayerManager extends MapLayerManager { await _focus(); visible = true; + + if (_lastFetchTime == null || DateTime.now().difference(_lastFetchTime!).inMinutes > 5) await _fetchData(); } catch (e, s) { TalkerManager.instance.error('PrecipitationMapLayerManager.show', e, s); } diff --git a/lib/app/map/_lib/managers/radar.dart b/lib/app/map/_lib/managers/radar.dart index f82ab2712..51c25a517 100644 --- a/lib/app/map/_lib/managers/radar.dart +++ b/lib/app/map/_lib/managers/radar.dart @@ -33,6 +33,8 @@ class RadarMapLayerManager extends MapLayerManager { final playStartTime = ValueNotifier(null); final playEndTime = ValueNotifier(null); + DateTime? _lastFetchTime; + Timer? _playTimer; final Set _preloadedLayers = {}; final int Function()? getActiveLayerCount; @@ -324,21 +326,27 @@ class RadarMapLayerManager extends MapLayerManager { } } + Future _fetchData() async { + final radarList = (await ExpTech().getRadarList()).reversed.toList(); + if (!context.mounted) return; + + GlobalProviders.data.setRadar(radarList); + currentRadarTime.value ??= radarList.first; + _lastFetchTime = DateTime.now(); + } + @override Future setup() async { if (didSetup) return; try { - if (GlobalProviders.data.radar.isEmpty) { - final radarList = (await ExpTech().getRadarList()).reversed.toList(); - if (!context.mounted) return; + if (GlobalProviders.data.radar.isEmpty) await _fetchData(); - GlobalProviders.data.setRadar(radarList); - currentRadarTime.value = radarList.first; - } + final time = currentRadarTime.value; + if (time == null) throw Exception('Time is null'); - await _setupAndShowLayer(currentRadarTime.value!); - await _preloadAdjacentLayers(currentRadarTime.value!); + await _setupAndShowLayer(time); + await _preloadAdjacentLayers(time); didSetup = true; } catch (e, s) { @@ -376,6 +384,8 @@ class RadarMapLayerManager extends MapLayerManager { await _focus(); visible = true; + + if (_lastFetchTime == null || DateTime.now().difference(_lastFetchTime!).inMinutes > 5) await _fetchData(); } catch (e, s) { TalkerManager.instance.error('RadarMapLayerManager.show', e, s); } diff --git a/lib/app/map/_lib/managers/report.dart b/lib/app/map/_lib/managers/report.dart index 682cdd45d..e906e46c9 100644 --- a/lib/app/map/_lib/managers/report.dart +++ b/lib/app/map/_lib/managers/report.dart @@ -45,6 +45,8 @@ class ReportMapLayerManager extends MapLayerManager { final currentReport = ValueNotifier(null); final isLoading = ValueNotifier(false); + DateTime? _lastFetchTime; + Future setReport(String? reportId, {bool focus = true}) async { if (isLoading.value) return; @@ -96,17 +98,20 @@ class ReportMapLayerManager extends MapLayerManager { ); } + Future _fetchData() async { + final reportList = await ExpTech().getReportList(); + if (!context.mounted) return; + + GlobalProviders.data.setPartialReport(reportList); + _lastFetchTime = DateTime.now(); + } + @override Future setup() async { if (didSetup) return; try { - if (GlobalProviders.data.partialReport.isEmpty) { - final reportList = await ExpTech().getReportList(); - if (!context.mounted) return; - - GlobalProviders.data.setPartialReport(reportList); - } + if (GlobalProviders.data.partialReport.isEmpty) await _fetchData(); final sourceId = MapSourceIds.report(); final layerId = MapLayerIds.report(); @@ -201,6 +206,8 @@ class ReportMapLayerManager extends MapLayerManager { } visible = true; + + if (_lastFetchTime == null || DateTime.now().difference(_lastFetchTime!).inMinutes > 5) await _fetchData(); } catch (e, s) { TalkerManager.instance.error('ReportMapLayerManager.show', e, s); } diff --git a/lib/app/map/_lib/managers/temperature.dart b/lib/app/map/_lib/managers/temperature.dart index 423dbe952..5dbfd2428 100644 --- a/lib/app/map/_lib/managers/temperature.dart +++ b/lib/app/map/_lib/managers/temperature.dart @@ -52,6 +52,8 @@ class TemperatureMapLayerManager extends MapLayerManager { final currentTemperatureTime = ValueNotifier(GlobalProviders.data.temperature.firstOrNull); final isLoading = ValueNotifier(false); + DateTime? _lastFetchTime; + Function(String)? onTimeChanged; Future setTemperatureTime(String time) async { @@ -86,6 +88,19 @@ class TemperatureMapLayerManager extends MapLayerManager { } } + Future _fetchData() async { + try { + final temperatureList = (await ExpTech().getWeatherList()).reversed.toList(); + if (!context.mounted) return; + + GlobalProviders.data.setTemperature(temperatureList); + currentTemperatureTime.value ??= temperatureList.first; + _lastFetchTime = DateTime.now(); + } catch (e, s) { + TalkerManager.instance.error('TemperatureMapLayerManager._fetchData', e, s); + } + } + @override Future setup() async { if (didSetup) return; @@ -93,13 +108,7 @@ class TemperatureMapLayerManager extends MapLayerManager { final colors = context.colors; try { - if (GlobalProviders.data.temperature.isEmpty) { - final temperatureList = (await ExpTech().getWeatherList()).reversed.toList(); - if (!context.mounted) return; - - GlobalProviders.data.setTemperature(temperatureList); - currentTemperatureTime.value = temperatureList.first; - } + if (GlobalProviders.data.temperature.isEmpty) await _fetchData(); final time = currentTemperatureTime.value; @@ -248,6 +257,8 @@ class TemperatureMapLayerManager extends MapLayerManager { await _focus(); visible = true; + + if (_lastFetchTime == null || DateTime.now().difference(_lastFetchTime!).inMinutes > 5) await _fetchData(); } catch (e, s) { TalkerManager.instance.error('TemperatureMapLayerManager.show', e, s); } diff --git a/lib/app/map/_lib/managers/wind.dart b/lib/app/map/_lib/managers/wind.dart index eb11ddc9d..9c0c2e969 100644 --- a/lib/app/map/_lib/managers/wind.dart +++ b/lib/app/map/_lib/managers/wind.dart @@ -44,6 +44,8 @@ class WindMapLayerManager extends MapLayerManager { final currentWindTime = ValueNotifier(GlobalProviders.data.wind.firstOrNull); final isLoading = ValueNotifier(false); + DateTime? _lastFetchTime; + Function(String)? onTimeChanged; Future setWindTime(String time) async { @@ -64,6 +66,15 @@ class WindMapLayerManager extends MapLayerManager { } } + Future _fetchData() async { + final windList = (await ExpTech().getWeatherList()).reversed.toList(); + if (!context.mounted) return; + + GlobalProviders.data.setWind(windList); + currentWindTime.value ??= windList.first; + _lastFetchTime = DateTime.now(); + } + @override Future setup() async { if (didSetup) return; @@ -71,13 +82,7 @@ class WindMapLayerManager extends MapLayerManager { final colors = context.colors; try { - if (GlobalProviders.data.wind.isEmpty) { - final windList = (await ExpTech().getWeatherList()).reversed.toList(); - if (!context.mounted) return; - - GlobalProviders.data.setWind(windList); - currentWindTime.value = windList.first; - } + if (GlobalProviders.data.wind.isEmpty) await _fetchData(); final time = currentWindTime.value; @@ -201,6 +206,8 @@ class WindMapLayerManager extends MapLayerManager { await controller.setLayerVisibility('$layerId-label', true); visible = true; + + if (_lastFetchTime == null || DateTime.now().difference(_lastFetchTime!).inMinutes > 5) await _fetchData(); } catch (e, s) { TalkerManager.instance.error('WindMapLayerManager.show', e, s); }