feat: 重构会话管理与提醒通知系统

This commit is contained in:
qzl
2026-03-31 18:26:36 +08:00
parent a8c262e9c7
commit 9a231dae9e
31 changed files with 650 additions and 223 deletions
+9 -1
View File
@@ -14,9 +14,17 @@ class CacheScope {
}
static String token() {
final value = maybeToken();
if (value == null) {
throw StateError('CacheScope not configured - user must be logged in');
}
return value;
}
static String? maybeToken() {
final raw = _provider?.call()?.trim();
if (raw == null || raw.isEmpty) {
return 'anonymous';
return null;
}
return raw;
}
+3 -2
View File
@@ -222,8 +222,9 @@ class CacheInvalidator {
void invalidate(String key) {
final store = _store;
if (store != null) {
unawaited(store.remove(CacheScope.scopedKey(key)));
final scope = CacheScope.maybeToken();
if (store != null && scope != null) {
unawaited(store.remove(CacheScope.scopedKey(key, scopeToken: scope)));
}
}
+29 -4
View File
@@ -32,7 +32,10 @@ abstract class CachedRepository<T> {
bool Function(T loaded)? shouldWriteLoaded,
bool forceRefresh = false,
}) async {
final scopeToken = CacheScope.token();
final scopeToken = CacheScope.maybeToken();
if (scopeToken == null) {
return loadFromRemote();
}
final scopedKey = CacheScope.scopedKey(key, scopeToken: scopeToken);
if (forceRefresh) {
@@ -71,12 +74,22 @@ abstract class CachedRepository<T> {
}
Future<CacheEntry<T>?> readCacheEntry(String key, {String? scopeToken}) {
return _readDecodedEntry(CacheScope.scopedKey(key, scopeToken: scopeToken));
final resolvedScope = _resolveScopeToken(scopeToken);
if (resolvedScope == null) {
return Future<CacheEntry<T>?>.value(null);
}
return _readDecodedEntry(
CacheScope.scopedKey(key, scopeToken: resolvedScope),
);
}
Future<void> writeCacheEntry(String key, T value, {String? scopeToken}) {
final resolvedScope = _resolveScopeToken(scopeToken);
if (resolvedScope == null) {
return Future<void>.value();
}
return store.write<CacheEntry<Object?>>(
_scopedKey(key, scopeToken: scopeToken),
_scopedKey(key, scopeToken: resolvedScope),
CacheEntry<Object?>(value: encodeValue(value), fetchedAt: now()),
);
}
@@ -98,7 +111,11 @@ abstract class CachedRepository<T> {
}
Future<void> removeCacheKey(String key, {String? scopeToken}) {
return store.remove(CacheScope.scopedKey(key, scopeToken: scopeToken));
final resolvedScope = _resolveScopeToken(scopeToken);
if (resolvedScope == null) {
return Future<void>.value();
}
return store.remove(CacheScope.scopedKey(key, scopeToken: resolvedScope));
}
void refreshInBackground({
@@ -140,4 +157,12 @@ abstract class CachedRepository<T> {
String _scopedKey(String key, {String? scopeToken}) {
return CacheScope.scopedKey(key, scopeToken: scopeToken);
}
String? _resolveScopeToken(String? scopeToken) {
final scoped = scopeToken?.trim();
if (scoped != null && scoped.isNotEmpty) {
return scoped;
}
return CacheScope.maybeToken();
}
}