import '../../../users/data/models/user_response.dart'; class SettingsUserCache { UserResponse? _cachedUser; Future? _inflight; int _generation = 0; UserResponse? get cachedUser => _cachedUser; Future getOrLoad(Future Function() loader) { final cached = _cachedUser; if (cached != null) { return Future.value(cached); } final inflight = _inflight; if (inflight != null) { return inflight; } final generation = _generation; late final Future 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; } }