refreshData static method
Future<RefreshResult>
refreshData(
- ReportTemplate template, {
- Map<
String, dynamic> ? parameters, - List<
ReportFilter> ? filters, - Duration? cacheDuration,
- bool forceRefresh = false,
- DataRefreshCallback? refreshCallback,
Refreshes data, using the cache
Implementation
static Future<RefreshResult> refreshData(
ReportTemplate template, {
Map<String, dynamic>? parameters,
List<ReportFilter>? filters,
Duration? cacheDuration,
bool forceRefresh = false,
DataRefreshCallback? refreshCallback,
}) async {
final cacheKey = _generateCacheKey(template, parameters, filters);
try {
// Unless forced, try the cache first
if (!forceRefresh) {
final cachedData = await DataCacheService.getCachedData(cacheKey);
if (cachedData != null && !cachedData.isExpired) {
return RefreshResult(
data: cachedData.data,
source: DataSource.cache,
timestamp: cachedData.timestamp,
metadata: cachedData.metadata,
);
}
}
if (refreshCallback != null) {
final startTime = DateTime.now();
final data = await refreshCallback(template, parameters, filters);
final endTime = DateTime.now();
// Salva in cache
await DataCacheService.cacheData(
cacheKey,
data,
duration: cacheDuration,
metadata: {
'template': template.name,
'parameters': parameters,
'filters': filters?.map((f) => f.field).toList(),
'refreshTime': endTime.millisecondsSinceEpoch,
'duration': endTime.difference(startTime).inMilliseconds,
},
);
return RefreshResult(
data: data,
source: DataSource.remote,
timestamp: endTime,
metadata: {
'refreshDuration': endTime.difference(startTime).inMilliseconds,
'cacheKey': cacheKey,
},
);
} else {
throw Exception('No refresh callback provided');
}
} catch (e) {
// On error, use the cache even when expired
if (!forceRefresh) {
final cachedData = await DataCacheService.getCachedData(cacheKey);
if (cachedData != null) {
return RefreshResult(
data: cachedData.data,
source: DataSource.cache,
timestamp: cachedData.timestamp,
metadata: {
...cachedData.metadata,
'warning':
'Data from the expired cache, because the refresh failed',
'error': e.toString(),
},
);
}
}
throw Exception('Error while refreshing the data: $e');
}
}