refactor: merge profile cache into unified cache repository

This commit is contained in:
qzl
2026-03-20 15:29:06 +08:00
parent 1cea877bf1
commit a99973fb96
6 changed files with 202 additions and 85 deletions
@@ -1,49 +1,30 @@
import 'dart:async';
import '../../../users/data/models/user_response.dart';
import 'user_profile_cache_repository.dart';
class SettingsUserCache {
final UserProfileCacheRepository _repository;
SettingsUserCache(this._repository);
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;
Future<UserResponse> getProfile({bool forceRefresh = false}) async {
final user = await _repository.getProfile(forceRefresh: forceRefresh);
_cachedUser = user;
return user;
}
void set(UserResponse user) {
_cachedUser = user;
unawaited(_repository.setCached(user));
}
void invalidate() {
_generation += 1;
_cachedUser = null;
_inflight = null;
unawaited(_repository.invalidate());
}
}