Files
social-app/apps/lib/features/settings/data/services/settings_user_cache.dart
T

50 lines
1.1 KiB
Dart

import '../../../users/data/models/user_response.dart';
class SettingsUserCache {
UserResponse? _cachedUser;
Future<UserResponse>? _inflight;
int _generation = 0;
UserResponse? get cachedUser => _cachedUser;
Future<UserResponse> getOrLoad(Future<UserResponse> Function() loader) {
final cached = _cachedUser;
if (cached != null) {
return Future<UserResponse>.value(cached);
}
final inflight = _inflight;
if (inflight != null) {
return inflight;
}
final generation = _generation;
late final Future<UserResponse> request;
request = loader()
.then((user) {
if (generation == _generation) {
_cachedUser = user;
}
return user;
})
.whenComplete(() {
if (identical(_inflight, request)) {
_inflight = null;
}
});
_inflight = request;
return request;
}
void set(UserResponse user) {
_cachedUser = user;
}
void invalidate() {
_generation += 1;
_cachedUser = null;
_inflight = null;
}
}