notifySubscriptionsWithLocalData<TModel extends RepositoryModel> method

  1. @protected
  2. @visibleForTesting
Future<void> notifySubscriptionsWithLocalData<TModel extends RepositoryModel>({
  1. 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>[]);
    }
  }
}