50 lines
1.1 KiB
Dart
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;
|
||
|
|
}
|
||
|
|
}
|