call method
Implementation
R call(List<dynamic> args) {
final key = _makeKey(args);
final cached = _cache[key];
final now = DateTime.now().millisecondsSinceEpoch;
// Populate cache
if (cached == null) {
final value = _fn(args);
_cache[key] = _CacheEntry(value: value, timestamp: now);
return value;
}
// If stale and not already refreshing
if (now - cached.timestamp > cacheLifetime.inMilliseconds &&
!cached.refreshing) {
cached.refreshing = true;
// Schedule async refresh (non-blocking)
final staleEntry = cached;
Future.microtask(() {
try {
final newValue = _fn(args);
if (_cache[key] == staleEntry) {
_cache[key] = _CacheEntry(
value: newValue,
timestamp: DateTime.now().millisecondsSinceEpoch,
);
}
} catch (_) {
if (_cache[key] == staleEntry) {
_cache.remove(key);
}
}
});
return cached.value;
}
return _cache[key]!.value;
}