QueryObserver test created
This commit is contained in:
@@ -120,7 +120,7 @@ class QueryFilters {
|
||||
bool? exact;
|
||||
bool? inactive;
|
||||
bool Function(Query query)? predicate;
|
||||
bool? queryKey;
|
||||
QueryKey? queryKey;
|
||||
bool? stale;
|
||||
bool? fetching;
|
||||
|
||||
@@ -162,7 +162,7 @@ class RefetchableQueryFilters<TPageData> extends QueryFilters
|
||||
bool? exact,
|
||||
bool? inactive,
|
||||
bool Function(Query query)? predicate,
|
||||
bool? queryKey,
|
||||
QueryKey? queryKey,
|
||||
bool? stale,
|
||||
bool? fetching,
|
||||
this.refetchPage,
|
||||
@@ -212,7 +212,7 @@ class InvalidateQueryFilters<TPageData>
|
||||
bool? exact,
|
||||
bool? inactive,
|
||||
bool Function(Query query)? predicate,
|
||||
bool? queryKey,
|
||||
QueryKey? queryKey,
|
||||
bool? stale,
|
||||
bool? fetching,
|
||||
bool Function(TPageData lastPage, int index, List<TPageData> allPages)?
|
||||
@@ -452,6 +452,11 @@ class QueryObserverOptions<
|
||||
QueryMeta? meta,
|
||||
bool? structuralSharing,
|
||||
bool? defaulted,
|
||||
ShouldRetryFunction<TError>? retry,
|
||||
RetryDelayFunction<TError>? retryDelay,
|
||||
QueryBehavior<TQueryFnData, TError, TQueryData>? behavior,
|
||||
GetPreviousPageParamFunction<TQueryFnData>? getPreviousPageParam,
|
||||
GetNextPageParamFunction<TQueryFnData>? getNextPageParam,
|
||||
}) : super(
|
||||
queryKey: queryKey,
|
||||
queryKeyHashFn: queryKeyHashFn,
|
||||
@@ -464,6 +469,11 @@ class QueryObserverOptions<
|
||||
meta: meta,
|
||||
structuralSharing: structuralSharing,
|
||||
defaulted: defaulted,
|
||||
behavior: behavior,
|
||||
getNextPageParam: getNextPageParam,
|
||||
getPreviousPageParam: getPreviousPageParam,
|
||||
retry: retry,
|
||||
retryDelay: retryDelay,
|
||||
);
|
||||
|
||||
QueryObserverOptions.fromJson(Map<String, dynamic> json)
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import 'dart:async';
|
||||
import 'dart:collection';
|
||||
import 'dart:convert';
|
||||
import 'dart:math';
|
||||
|
||||
import 'package:fl_query/src/core/models.dart';
|
||||
@@ -280,7 +282,9 @@ class Query<TQueryFnData extends Map<String, dynamic>, TError,
|
||||
data = prevData as TData;
|
||||
} else if (this.options.structuralSharing != false) {
|
||||
// Structurally share data between prev and new data if needed
|
||||
data = replaceEqualDeep(prevData, data);
|
||||
final merged =
|
||||
Map<String, dynamic>.from(replaceEqualDeep(prevData, data));
|
||||
data = merged as TData;
|
||||
}
|
||||
// Set data and mark it as cached
|
||||
_dispatch(Action(
|
||||
@@ -360,7 +364,7 @@ class Query<TQueryFnData extends Map<String, dynamic>, TError,
|
||||
// Use the options from the first observer with a query function if no function is found.
|
||||
// This can happen when the query is hydrated or created with setQueryData.
|
||||
if (this.options.queryFn == null) {
|
||||
var observer =
|
||||
final observer =
|
||||
_observers.firstWhereOrNull((x) => x.options.queryFn != null);
|
||||
if (observer != null) {
|
||||
_setOptions(QueryOptions<TQueryFnData, TError, TData>(
|
||||
|
||||
@@ -171,7 +171,7 @@ class QueryCache extends Subscribable<QueryCacheListener> {
|
||||
|
||||
void notify(QueryCacheNotifyEvent event) {
|
||||
notifyManager.batch(() {
|
||||
for (var listener in listeners) {
|
||||
for (final listener in listeners) {
|
||||
listener(event);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -266,7 +266,7 @@ class QueryClient {
|
||||
QueryFunction<TQueryFnData, dynamic>? queryFn,
|
||||
FetchQueryOptions<TQueryFnData, TError, TData>? options,
|
||||
}) {
|
||||
var defaultedOptions = this.defaultQueryOptions(
|
||||
final defaultedOptions = this.defaultQueryOptions(
|
||||
QueryObserverOptions<Map<String, dynamic>, dynamic, Map<String, dynamic>,
|
||||
TData>(
|
||||
queryFn: queryFn,
|
||||
@@ -285,7 +285,7 @@ class QueryClient {
|
||||
);
|
||||
// returning 0 indicates turing off retry
|
||||
defaultedOptions.retry ??= (_, __) => 0;
|
||||
var query = _queryCache.build<Map<String, dynamic>, dynamic, TData>(
|
||||
final query = _queryCache.build<Map<String, dynamic>, dynamic, TData>(
|
||||
this, defaultedOptions);
|
||||
return query.isStaleByTime(defaultedOptions.staleTime)
|
||||
? query.fetch(defaultedOptions)
|
||||
@@ -313,7 +313,7 @@ class QueryClient {
|
||||
TQueryData extends Map<String, dynamic>>(
|
||||
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>? options) {
|
||||
if (options?.defaulted == true) return options!;
|
||||
var defaultedOptions =
|
||||
final defaultedOptions =
|
||||
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>.fromJson({
|
||||
...(_defaultOptions.queries?.toJson() ?? {}),
|
||||
...(getQueryDefaults(options?.queryKey)?.toJson() ?? {}),
|
||||
|
||||
@@ -94,6 +94,9 @@ class QueryObserver<
|
||||
Timer? _refetchInterval;
|
||||
Duration? _currentRefetchInterval;
|
||||
|
||||
@protected
|
||||
Timer? get refetchInterval => _refetchInterval;
|
||||
|
||||
QueryObserver(
|
||||
this._client,
|
||||
QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>? _options,
|
||||
@@ -225,9 +228,9 @@ class QueryObserver<
|
||||
throw UnimplementedError("COULD NOT IMPLEMENT DUE TO LANGUAGE LIMITATIONS");
|
||||
}
|
||||
|
||||
Future<QueryObserverResult<TData, TError>> getNextResult(
|
||||
Future<QueryObserverResult<TData, TError>> getNextResult([
|
||||
bool? throwOnError,
|
||||
) {
|
||||
]) {
|
||||
final completer = Completer<QueryObserverResult<TData, TError>>();
|
||||
var unsubscribe;
|
||||
unsubscribe = subscribe((result) {
|
||||
@@ -445,7 +448,8 @@ class QueryObserver<
|
||||
try {
|
||||
data = options.select?.call(state.data);
|
||||
if (options.structuralSharing != false) {
|
||||
data = replaceEqualDeep(prevResult?.data, data);
|
||||
data = Map<String, dynamic>.from(
|
||||
replaceEqualDeep(prevResult?.data, data)) as TData;
|
||||
}
|
||||
if (options.select != null && data != null) {
|
||||
_previousSelect = SelectQuery<TQueryData, TData>(
|
||||
|
||||
Reference in New Issue
Block a user