scheduleMicrotask utils removed in favor of dart:async

getQueryData wrong arrangment of arguments
Query & Retryer's future property is replaced with Completer
queryFn, fetchFn & fn types corrected
exported all the functions/class/enum  from core (incomplete)
flutter dependency dropped since the core is a Dart package
This commit is contained in:
Kingkor Roy Tirtho
2022-02-12 12:58:17 +06:00
parent 70b84fe85a
commit 58f98e6e74
12 changed files with 109 additions and 105 deletions
+14 -16
View File
@@ -127,20 +127,18 @@ var todos = [
},
];
void main(List<String> arguments) {
QueryCache cache = QueryCache();
for (var todo in todos.asMap().entries) {
cache.writeQuery(QueryKey.fromList(["KEY", todo.key.toString()]), data: {
"data": todo.value,
"meta": {
"created": DateTime.now(),
"expiration": DateTime.now().add(Duration(hours: 2))
}
});
}
for (var i = 0; i < todos.length; i++) {
var result = cache.readQuery(QueryKey.fromList(["KEY", i.toString()]));
print(result);
}
void main(List<String> arguments) async {
var key = QueryKey("TEST");
QueryClient queryClient = QueryClient();
queryClient.mount();
var data = await queryClient.fetchQuery<Map, dynamic, Map>(
queryKey: key,
queryFn: (context) {
return Future.value(todos.first);
},
);
print("FETCHED DATA=====");
print(data);
print("======CACHED DATA");
print(queryClient.getQueryData(key));
}
-25
View File
@@ -8,13 +8,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "2.8.2"
characters:
dependency: transitive
description:
name: characters
url: "https://pub.dartlang.org"
source: hosted
version: "1.2.0"
charcode:
dependency: transitive
description:
@@ -43,11 +36,6 @@ packages:
relative: true
source: path
version: "0.0.1"
flutter:
dependency: transitive
description: flutter
source: sdk
version: "0.0.0"
hive:
dependency: transitive
description:
@@ -97,11 +85,6 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.1"
sky_engine:
dependency: transitive
description: flutter
source: sdk
version: "0.0.99"
source_span:
dependency: transitive
description:
@@ -137,13 +120,5 @@ packages:
url: "https://pub.dartlang.org"
source: hosted
version: "3.0.5"
vector_math:
dependency: transitive
description:
name: vector_math
url: "https://pub.dartlang.org"
source: hosted
version: "2.1.1"
sdks:
dart: ">=2.15.1 <3.0.0"
flutter: ">=1.17.0"
+3
View File
@@ -1 +1,4 @@
library fl_query;
export 'package:fl_query/src/core/core.dart';
// export 'package:fl_query/src/core/framework.dart';
+21
View File
@@ -0,0 +1,21 @@
export 'package:fl_query/src/core/retryer.dart' show CancelledError;
export 'package:fl_query/src/core/query_cache.dart' show QueryCache;
export 'package:fl_query/src/core/query_client.dart' show QueryClient;
export 'package:fl_query/src/core/query_observer.dart' show QueryObserver;
export 'package:fl_query/src/core/query_key.dart';
// export 'package:fl_query/src/core/queriesObserver.dart' show QueriesObserver;
// export 'package:fl_query/src/core/infiniteQueryObserver.dart' show InfiniteQueryObserver;
// export 'package:fl_query/src/core/mutationCache.dart' show MutationCache;
// export 'package:fl_query/src/core/mutationObserver.dart' show MutationObserver;
// export 'package:fl_query/src/core/logger.dart' show setLogger;
export 'package:fl_query/src/core/notify_manager.dart' show notifyManager;
// export 'package:fl_query/src/core/focusManager.dart' show focusManager;
export 'package:fl_query/src/core/online_manager.dart' show onlineManager;
export 'package:fl_query/src/core/utils.dart' show hashQueryKey;
export 'package:fl_query/src/core/retryer.dart' show isCancelledError;
// export 'package:fl_query/src/core/hydration.dart' show dehydrate, DehydrateOptions, DehydratedState, HydrateOptions, ShouldDehydrateMutationFunction, ShouldDehydrateQueryFunction;
export 'package:fl_query/src/core/models.dart';
export 'package:fl_query/src/core/query.dart' show Query;
// export type { Mutation } from './mutation'
// export type { Logger } from './logger'
+3 -3
View File
@@ -23,7 +23,7 @@ class QueryOptions<TQueryFnData, TError, TData> {
RetryDelayFunction<TError>? retryDelay;
Duration? cacheTime;
bool Function(TData? oldData, TData newData)? isDataEqual;
QueryFunction? queryFn;
QueryFunction<TQueryFnData, dynamic>? queryFn;
QueryKey? queryKey;
/// Basically [QueryKey.key] in short form
@@ -434,7 +434,7 @@ class QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>
QueryKeyHashFunction? queryKeyHashFn,
Duration? cacheTime,
bool Function(TQueryData? oldData, TQueryData newData)? isDataEqual,
QueryFunction? queryFn,
QueryFunction<TQueryFnData, dynamic>? queryFn,
String? queryHash,
TQueryData? initialData,
DateTime? initialDataUpdatedAt,
@@ -532,7 +532,7 @@ class FetchQueryOptions<TQueryFnData, TError, TData>
RetryDelayFunction<TError>? retryDelay,
Duration? cacheTime,
bool Function(TData? oldData, TData newData)? isDataEqual,
QueryFunction? queryFn,
QueryFunction<TQueryFnData, dynamic>? queryFn,
QueryKey? queryKey,
String? queryHash,
QueryKeyHashFunction? queryKeyHashFn,
@@ -1,6 +1,6 @@
// TYPES
import 'package:fl_query/src/core/utils.dart';
import 'dart:async';
typedef NotifyCallback = void Function();
@@ -44,7 +44,7 @@ class _NotifyManager {
if (_transactions > 0) {
_queue.add(callback);
} else {
scheduleMicrotask((val) {
scheduleMicrotask(() {
_notifyFn(callback);
});
}
@@ -66,7 +66,7 @@ class _NotifyManager {
var queue = _queue;
_queue = [];
if (queue.isNotEmpty) {
scheduleMicrotask((val) {
scheduleMicrotask(() {
_batchNotifyFn(() {
queue.forEach((fn) {
_notifyFn(fn);
+44 -28
View File
@@ -18,7 +18,7 @@ class FetchOptions {
}
class FetchContext<TQueryFnData, TError, TData> {
FutureOr Function() fetchFn;
FutureOr<TQueryFnData> Function() fetchFn;
FetchOptions? fetchOptions;
QueryOptions<TQueryFnData, TError, TData> options;
QueryKey queryKey;
@@ -171,7 +171,8 @@ class Query<TQueryFnData, TError, TData> {
QueryMeta? meta;
QueryCache _cache;
Future<TData>? _future;
// Future<TData>? _future;
Completer<TData>? _completer;
Timer? _gcTimeout;
Retryer<TData, TError>? _retryer;
List<QueryObserver> _observers;
@@ -268,22 +269,28 @@ class Query<TQueryFnData, TError, TData> {
DataUpdateFunction<TData?, TData> updater, {
DateTime? updatedAt,
}) {
var prevData = this.state.data;
var data = updater(prevData);
// Use prev data if an isDataEqual function is defined and returns `true`
if (this.options.isDataEqual?.call(prevData, data) == true) {
data = prevData as TData;
} else if (this.options.structuralSharing != false) {
// Structurally share data between prev and new data if needed
data = replaceEqualDeep<TData>(prevData ?? {} as TData, data);
try {
var prevData = this.state.data;
var data = updater(prevData);
// Use prev data if an isDataEqual function is defined and returns `true`
if (this.options.isDataEqual?.call(prevData, data) == true) {
data = prevData as TData;
} else if (this.options.structuralSharing != false) {
// Structurally share data between prev and new data if needed
data = replaceEqualDeep<TData>(prevData ?? {} as TData, data);
}
// Set data and mark it as cached
_dispatch(Action(
ActionType.success,
data: data,
dataUpdatedAt: updatedAt,
));
return data;
} catch (e, stack) {
print("[Query.setData] $e");
print(stack);
rethrow;
}
// Set data and mark it as cached
_dispatch(Action(
ActionType.success,
data: data,
dataUpdatedAt: updatedAt,
));
return data;
}
void setState(
@@ -298,9 +305,13 @@ class Query<TQueryFnData, TError, TData> {
}
Future<void> cancel({bool? revert, bool? silent}) {
var future = _future;
// var future = _future;
_retryer?.cancel(revert: revert, silent: silent);
return future != null ? future.then(noop).catchError(noop) : Future.value();
if (_completer != null && !_completer!.isCompleted) {
_completer!.completeError("Cancelled Job", StackTrace.current);
return _completer!.future.then(noop).catchError(noop);
}
return Future.value();
}
void reset() {
@@ -330,11 +341,11 @@ class Query<TQueryFnData, TError, TData> {
fetchOptions?.cancelRefetch == true) {
// Silently cancel current fetch if the user wants to cancel re-fetches
this.cancel(silent: true);
} else if (_future != null) {
} else if (_completer != null) {
// make sure that retries that were potentially cancelled due to unmounts can continue
_retryer?.continueRetry();
// Return current promise if we are already fetching
return _future!;
return _completer!.future;
}
}
@@ -354,7 +365,8 @@ class Query<TQueryFnData, TError, TData> {
queryKeyHashFn: observer.options.queryKeyHashFn,
cacheTime: observer.options.cacheTime,
isDataEqual: observer.options.isDataEqual,
queryFn: observer.options.queryFn,
queryFn:
observer.options.queryFn as QueryFunction<TQueryFnData, dynamic>,
queryHash: observer.options.queryHash,
initialData: observer.options.initialData,
initialDataUpdatedAt: observer.options.initialDataUpdatedAt,
@@ -387,16 +399,17 @@ class Query<TQueryFnData, TError, TData> {
// })
// Create fetch function
fetchFn() {
FutureOr<TQueryFnData> fetchFn() {
if (this.options.queryFn == null) {
return Future.error('Missing queryFn');
}
_abortSignalConsumed = false;
return options?.queryFn?.call(queryFnContext);
return options!.queryFn!.call(queryFnContext);
}
// Trigger behavior hook
FetchContext<TQueryFnData, TError, TData> context = FetchContext(
FetchContext<TQueryFnData, TError, TData> context =
FetchContext<TQueryFnData, TError, TData>(
fetchOptions: fetchOptions,
options: this.options,
queryKey: queryKey,
@@ -423,7 +436,7 @@ class Query<TQueryFnData, TError, TData> {
// Notify cache callback
_cache.onData?.call(data, this);
if (_completer?.isCompleted == false) _completer?.complete(data);
// Remove query after fetching if cache time is 0
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
_optionalRemove();
@@ -447,6 +460,9 @@ class Query<TQueryFnData, TError, TData> {
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
_optionalRemove();
}
if (_completer?.isCompleted == false)
_completer?.completeError(
error ?? "Retry Failed", StackTrace.current);
},
onFail: (failureCount, error) {
_dispatch(Action(ActionType.failed));
@@ -461,8 +477,8 @@ class Query<TQueryFnData, TError, TData> {
retryDelay: context.options.retryDelay,
);
this._future = _retryer!.future;
return this._future!;
this._completer = _retryer!.completer;
return this._completer!.future;
}
void _dispatch(Action<TData, TError> action) {
@@ -86,8 +86,7 @@ class QueryClient {
// }
TData? getQueryData<TData>(
QueryKey,
queryKey, [
QueryKey queryKey, [
QueryFilters? filters,
]) {
return _queryCache
@@ -357,13 +356,14 @@ class QueryClient {
}
}
getMutationDefaults() {}
setMutationDefaults() {}
// getMutationDefaults() {}
// setMutationDefaults() {}
// getMutationCache() {}
QueryCache getQueryCache() {
return _queryCache;
}
getMutationCache() {}
void clear() {
_queryCache.clear();
// _mutationCache.clear();
+7 -6
View File
@@ -43,7 +43,8 @@ class Retryer<TData, TError> {
late void Function() cancelRetry;
late void Function() continueRetry;
late void Function() continueFn;
late Future<TData> future;
// late Future<TData> future;
late Completer<TData> completer;
int failureCount;
bool isPaused;
bool isResolved;
@@ -92,9 +93,9 @@ class Retryer<TData, TError> {
this.continueFn = () => continueFn?.call();
Completer<TData> completer = Completer<TData>();
completer = Completer<TData>();
this.future = completer.future;
// this.future = completer.future;
resolve(value) {
if (!this.isResolved) {
@@ -115,11 +116,11 @@ class Retryer<TData, TError> {
}
pause() {
Completer completer = Completer();
if (!completer.isCompleted) continueFn = completer.complete;
Completer pauseCompleter = Completer();
if (!pauseCompleter.isCompleted) continueFn = pauseCompleter.complete;
this.isPaused = true;
onPause?.call();
return completer.future.then((val) {
return pauseCompleter.future.then((val) {
continueFn = null;
this.isPaused = false;
onContinue?.call();
@@ -1,4 +1,4 @@
import 'package:flutter/material.dart';
import 'package:meta/meta.dart';
abstract class Subscribable<TListener extends Function> {
@protected
+4 -14
View File
@@ -2,16 +2,6 @@ import 'package:fl_query/src/core/models.dart';
import 'package:fl_query/src/core/query.dart';
import 'package:fl_query/src/core/query_key.dart';
/**
* Schedules a microtask.
* This can be useful to schedule state updates after rendering.
*/
void scheduleMicrotask(void Function(dynamic val) callback) {
Future.value()
.then(callback)
.catchError((error) => Future.delayed(Duration.zero, () => throw error));
}
/// Default query keys hash function.
/// Dummy function just to fill the gaps for original react-query like
/// function body signatures
@@ -113,15 +103,15 @@ T replaceEqualDeep<T>(T a, T b) {
bool isList = (a is Iterable && b is Iterable);
if (isList || (a is Map && b is Map)) {
var aSize = isList ? a.length : (a as Map).keys.length;
var bItems = isList ? b : (b as Map).keys;
var bSize = bItems.length;
int aSize = isList ? a.length : (a as Map).keys.length;
List bItems = (isList ? b : (b as Map).keys).toList();
int bSize = bItems.length;
var copy;
int equalItems = 0;
for (int i = 0; i < bSize; i++) {
var key = isList ? i : (bItems as Map)[i];
var key = isList ? i : bItems[i];
if (isList) {
copy ??= [];
copy[key] = replaceEqualDeep((a as List)[key], (b as List)[key]);
+4 -4
View File
@@ -5,11 +5,11 @@ homepage: https://github.com/KRTirtho/fl-query
environment:
sdk: ">=2.15.1 <3.0.0"
flutter: ">=1.17.0"
# flutter: ">=1.17.0"
dependencies:
flutter:
sdk: flutter
# flutter:
# sdk: flutter
meta: ^1.3.0
path: ^1.8.0
hive: ^2.0.0
@@ -27,4 +27,4 @@ dev_dependencies:
lints: ^1.0.1
# The following section is specific to Flutter.
flutter:
# flutter: