get<_Model extends _RepositoryModel> method
Future<List<_Model> >
get<_Model extends _RepositoryModel>({
- OfflineFirstGetPolicy policy = OfflineFirstGetPolicy.awaitRemoteWhenNoneExist,
- Query? query,
- bool seedOnly = false,
Load association from SQLite first; if the _Model
hasn't been loaded previously,
fetch it from remoteProvider and hydrate SQLite.
For available query providerArgs see remoteProvider#get
SqliteProvider.get
.
seedOnly
does not load data from SQLite after inserting records. Association queries
can be expensive for large datasets, making deserialization a significant hit when the result
is ignorable (e.g. eager loading). Defaults to false
.
Implementation
@override
Future<List<_Model>> get<_Model extends _RepositoryModel>({
OfflineFirstGetPolicy policy = OfflineFirstGetPolicy.awaitRemoteWhenNoneExist,
Query? query,
bool seedOnly = false,
}) async {
final withPolicy = applyPolicyToQuery(query, get: policy);
query = (withPolicy ?? Query()).copyWith(action: QueryAction.get);
logger.finest('#get: $_Model $query');
if (memoryCacheProvider.canFind<_Model>(query)) {
final memoryCacheResults = memoryCacheProvider.get<_Model>(query: query, repository: this);
if (memoryCacheResults?.isNotEmpty ?? false) return memoryCacheResults!;
}
final modelExists = await exists<_Model>(query: query);
final requireRemote = policy == OfflineFirstGetPolicy.awaitRemote;
final hydrateUnexisting = policy == OfflineFirstGetPolicy.awaitRemoteWhenNoneExist;
final alwaysHydrate = policy == OfflineFirstGetPolicy.alwaysHydrate;
if (requireRemote || (hydrateUnexisting && !modelExists)) {
return await hydrate<_Model>(query: query, deserializeSqlite: !seedOnly);
} else if (alwaysHydrate) {
// start round trip for fresh data
// ignore: unawaited_futures
hydrate<_Model>(query: query, deserializeSqlite: !seedOnly);
}
return await sqliteProvider
.get<_Model>(query: query, repository: this)
// cache this query
.then((m) => memoryCacheProvider.hydrate<_Model>(m));
}