notifySubscriptionsWithLocalData<TModel extends RepositoryModel> method
- @protected
- @visibleForTesting
- bool notifyWhenEmpty = true,
Iterate through subscriptions after an upsert and notify any subscribe listeners.
Implementation
@protected
@visibleForTesting
Future<void> notifySubscriptionsWithLocalData<TModel extends RepositoryModel>({
bool notifyWhenEmpty = true,
}) async {
final queriesControllers = subscriptions[TModel]?.entries;
if (queriesControllers?.isEmpty ?? true) return;
// create a copy of the controllers to avoid concurrent modification while looping
final cachedControllers =
List<MapEntry<Query?, StreamController<List<RepositoryModel>>>>.from(queriesControllers!);
for (final queryController in cachedControllers) {
final query = queryController.key;
final controller = queryController.value;
if (controller.isClosed || controller.isPaused) continue;
if (query == null || memoryCacheProvider.canFind<TModel>(query)) {
final results = memoryCacheProvider.get<TModel>(query: query);
if (!controller.isClosed && (results?.isNotEmpty ?? false)) controller.add(results!);
}
final existsInSqlite = await sqliteProvider.exists<TModel>(query: query, repository: this);
if (existsInSqlite) {
final results = await sqliteProvider.get<TModel>(query: query, repository: this);
if (!controller.isClosed) controller.add(results);
} else if (notifyWhenEmpty) {
if (!controller.isClosed) controller.add(<TModel>[]);
}
}
}