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:
@@ -127,20 +127,18 @@ var todos = [
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
void main(List<String> arguments) {
|
void main(List<String> arguments) async {
|
||||||
QueryCache cache = QueryCache();
|
var key = QueryKey("TEST");
|
||||||
for (var todo in todos.asMap().entries) {
|
QueryClient queryClient = QueryClient();
|
||||||
cache.writeQuery(QueryKey.fromList(["KEY", todo.key.toString()]), data: {
|
queryClient.mount();
|
||||||
"data": todo.value,
|
var data = await queryClient.fetchQuery<Map, dynamic, Map>(
|
||||||
"meta": {
|
queryKey: key,
|
||||||
"created": DateTime.now(),
|
queryFn: (context) {
|
||||||
"expiration": DateTime.now().add(Duration(hours: 2))
|
return Future.value(todos.first);
|
||||||
}
|
},
|
||||||
});
|
);
|
||||||
}
|
print("FETCHED DATA=====");
|
||||||
|
print(data);
|
||||||
for (var i = 0; i < todos.length; i++) {
|
print("======CACHED DATA");
|
||||||
var result = cache.readQuery(QueryKey.fromList(["KEY", i.toString()]));
|
print(queryClient.getQueryData(key));
|
||||||
print(result);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,13 +8,6 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.8.2"
|
version: "2.8.2"
|
||||||
characters:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: characters
|
|
||||||
url: "https://pub.dartlang.org"
|
|
||||||
source: hosted
|
|
||||||
version: "1.2.0"
|
|
||||||
charcode:
|
charcode:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -43,11 +36,6 @@ packages:
|
|||||||
relative: true
|
relative: true
|
||||||
source: path
|
source: path
|
||||||
version: "0.0.1"
|
version: "0.0.1"
|
||||||
flutter:
|
|
||||||
dependency: transitive
|
|
||||||
description: flutter
|
|
||||||
source: sdk
|
|
||||||
version: "0.0.0"
|
|
||||||
hive:
|
hive:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -97,11 +85,6 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.1"
|
version: "1.8.1"
|
||||||
sky_engine:
|
|
||||||
dependency: transitive
|
|
||||||
description: flutter
|
|
||||||
source: sdk
|
|
||||||
version: "0.0.99"
|
|
||||||
source_span:
|
source_span:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@@ -137,13 +120,5 @@ packages:
|
|||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "3.0.5"
|
version: "3.0.5"
|
||||||
vector_math:
|
|
||||||
dependency: transitive
|
|
||||||
description:
|
|
||||||
name: vector_math
|
|
||||||
url: "https://pub.dartlang.org"
|
|
||||||
source: hosted
|
|
||||||
version: "2.1.1"
|
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.15.1 <3.0.0"
|
dart: ">=2.15.1 <3.0.0"
|
||||||
flutter: ">=1.17.0"
|
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
library fl_query;
|
library fl_query;
|
||||||
|
|
||||||
|
export 'package:fl_query/src/core/core.dart';
|
||||||
|
// export 'package:fl_query/src/core/framework.dart';
|
||||||
|
|||||||
@@ -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'
|
||||||
@@ -23,7 +23,7 @@ class QueryOptions<TQueryFnData, TError, TData> {
|
|||||||
RetryDelayFunction<TError>? retryDelay;
|
RetryDelayFunction<TError>? retryDelay;
|
||||||
Duration? cacheTime;
|
Duration? cacheTime;
|
||||||
bool Function(TData? oldData, TData newData)? isDataEqual;
|
bool Function(TData? oldData, TData newData)? isDataEqual;
|
||||||
QueryFunction? queryFn;
|
QueryFunction<TQueryFnData, dynamic>? queryFn;
|
||||||
QueryKey? queryKey;
|
QueryKey? queryKey;
|
||||||
|
|
||||||
/// Basically [QueryKey.key] in short form
|
/// Basically [QueryKey.key] in short form
|
||||||
@@ -434,7 +434,7 @@ class QueryObserverOptions<TQueryFnData, TError, TData, TQueryData>
|
|||||||
QueryKeyHashFunction? queryKeyHashFn,
|
QueryKeyHashFunction? queryKeyHashFn,
|
||||||
Duration? cacheTime,
|
Duration? cacheTime,
|
||||||
bool Function(TQueryData? oldData, TQueryData newData)? isDataEqual,
|
bool Function(TQueryData? oldData, TQueryData newData)? isDataEqual,
|
||||||
QueryFunction? queryFn,
|
QueryFunction<TQueryFnData, dynamic>? queryFn,
|
||||||
String? queryHash,
|
String? queryHash,
|
||||||
TQueryData? initialData,
|
TQueryData? initialData,
|
||||||
DateTime? initialDataUpdatedAt,
|
DateTime? initialDataUpdatedAt,
|
||||||
@@ -532,7 +532,7 @@ class FetchQueryOptions<TQueryFnData, TError, TData>
|
|||||||
RetryDelayFunction<TError>? retryDelay,
|
RetryDelayFunction<TError>? retryDelay,
|
||||||
Duration? cacheTime,
|
Duration? cacheTime,
|
||||||
bool Function(TData? oldData, TData newData)? isDataEqual,
|
bool Function(TData? oldData, TData newData)? isDataEqual,
|
||||||
QueryFunction? queryFn,
|
QueryFunction<TQueryFnData, dynamic>? queryFn,
|
||||||
QueryKey? queryKey,
|
QueryKey? queryKey,
|
||||||
String? queryHash,
|
String? queryHash,
|
||||||
QueryKeyHashFunction? queryKeyHashFn,
|
QueryKeyHashFunction? queryKeyHashFn,
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// TYPES
|
// TYPES
|
||||||
|
|
||||||
import 'package:fl_query/src/core/utils.dart';
|
import 'dart:async';
|
||||||
|
|
||||||
typedef NotifyCallback = void Function();
|
typedef NotifyCallback = void Function();
|
||||||
|
|
||||||
@@ -44,7 +44,7 @@ class _NotifyManager {
|
|||||||
if (_transactions > 0) {
|
if (_transactions > 0) {
|
||||||
_queue.add(callback);
|
_queue.add(callback);
|
||||||
} else {
|
} else {
|
||||||
scheduleMicrotask((val) {
|
scheduleMicrotask(() {
|
||||||
_notifyFn(callback);
|
_notifyFn(callback);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -66,7 +66,7 @@ class _NotifyManager {
|
|||||||
var queue = _queue;
|
var queue = _queue;
|
||||||
_queue = [];
|
_queue = [];
|
||||||
if (queue.isNotEmpty) {
|
if (queue.isNotEmpty) {
|
||||||
scheduleMicrotask((val) {
|
scheduleMicrotask(() {
|
||||||
_batchNotifyFn(() {
|
_batchNotifyFn(() {
|
||||||
queue.forEach((fn) {
|
queue.forEach((fn) {
|
||||||
_notifyFn(fn);
|
_notifyFn(fn);
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class FetchOptions {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class FetchContext<TQueryFnData, TError, TData> {
|
class FetchContext<TQueryFnData, TError, TData> {
|
||||||
FutureOr Function() fetchFn;
|
FutureOr<TQueryFnData> Function() fetchFn;
|
||||||
FetchOptions? fetchOptions;
|
FetchOptions? fetchOptions;
|
||||||
QueryOptions<TQueryFnData, TError, TData> options;
|
QueryOptions<TQueryFnData, TError, TData> options;
|
||||||
QueryKey queryKey;
|
QueryKey queryKey;
|
||||||
@@ -171,7 +171,8 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
QueryMeta? meta;
|
QueryMeta? meta;
|
||||||
|
|
||||||
QueryCache _cache;
|
QueryCache _cache;
|
||||||
Future<TData>? _future;
|
// Future<TData>? _future;
|
||||||
|
Completer<TData>? _completer;
|
||||||
Timer? _gcTimeout;
|
Timer? _gcTimeout;
|
||||||
Retryer<TData, TError>? _retryer;
|
Retryer<TData, TError>? _retryer;
|
||||||
List<QueryObserver> _observers;
|
List<QueryObserver> _observers;
|
||||||
@@ -268,22 +269,28 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
DataUpdateFunction<TData?, TData> updater, {
|
DataUpdateFunction<TData?, TData> updater, {
|
||||||
DateTime? updatedAt,
|
DateTime? updatedAt,
|
||||||
}) {
|
}) {
|
||||||
var prevData = this.state.data;
|
try {
|
||||||
var data = updater(prevData);
|
var prevData = this.state.data;
|
||||||
// Use prev data if an isDataEqual function is defined and returns `true`
|
var data = updater(prevData);
|
||||||
if (this.options.isDataEqual?.call(prevData, data) == true) {
|
// Use prev data if an isDataEqual function is defined and returns `true`
|
||||||
data = prevData as TData;
|
if (this.options.isDataEqual?.call(prevData, data) == true) {
|
||||||
} else if (this.options.structuralSharing != false) {
|
data = prevData as TData;
|
||||||
// Structurally share data between prev and new data if needed
|
} else if (this.options.structuralSharing != false) {
|
||||||
data = replaceEqualDeep<TData>(prevData ?? {} as TData, data);
|
// 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(
|
void setState(
|
||||||
@@ -298,9 +305,13 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Future<void> cancel({bool? revert, bool? silent}) {
|
Future<void> cancel({bool? revert, bool? silent}) {
|
||||||
var future = _future;
|
// var future = _future;
|
||||||
_retryer?.cancel(revert: revert, silent: silent);
|
_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() {
|
void reset() {
|
||||||
@@ -330,11 +341,11 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
fetchOptions?.cancelRefetch == true) {
|
fetchOptions?.cancelRefetch == true) {
|
||||||
// Silently cancel current fetch if the user wants to cancel re-fetches
|
// Silently cancel current fetch if the user wants to cancel re-fetches
|
||||||
this.cancel(silent: true);
|
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
|
// make sure that retries that were potentially cancelled due to unmounts can continue
|
||||||
_retryer?.continueRetry();
|
_retryer?.continueRetry();
|
||||||
// Return current promise if we are already fetching
|
// 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,
|
queryKeyHashFn: observer.options.queryKeyHashFn,
|
||||||
cacheTime: observer.options.cacheTime,
|
cacheTime: observer.options.cacheTime,
|
||||||
isDataEqual: observer.options.isDataEqual,
|
isDataEqual: observer.options.isDataEqual,
|
||||||
queryFn: observer.options.queryFn,
|
queryFn:
|
||||||
|
observer.options.queryFn as QueryFunction<TQueryFnData, dynamic>,
|
||||||
queryHash: observer.options.queryHash,
|
queryHash: observer.options.queryHash,
|
||||||
initialData: observer.options.initialData,
|
initialData: observer.options.initialData,
|
||||||
initialDataUpdatedAt: observer.options.initialDataUpdatedAt,
|
initialDataUpdatedAt: observer.options.initialDataUpdatedAt,
|
||||||
@@ -387,16 +399,17 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
// })
|
// })
|
||||||
|
|
||||||
// Create fetch function
|
// Create fetch function
|
||||||
fetchFn() {
|
FutureOr<TQueryFnData> fetchFn() {
|
||||||
if (this.options.queryFn == null) {
|
if (this.options.queryFn == null) {
|
||||||
return Future.error('Missing queryFn');
|
return Future.error('Missing queryFn');
|
||||||
}
|
}
|
||||||
_abortSignalConsumed = false;
|
_abortSignalConsumed = false;
|
||||||
return options?.queryFn?.call(queryFnContext);
|
return options!.queryFn!.call(queryFnContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Trigger behavior hook
|
// Trigger behavior hook
|
||||||
FetchContext<TQueryFnData, TError, TData> context = FetchContext(
|
FetchContext<TQueryFnData, TError, TData> context =
|
||||||
|
FetchContext<TQueryFnData, TError, TData>(
|
||||||
fetchOptions: fetchOptions,
|
fetchOptions: fetchOptions,
|
||||||
options: this.options,
|
options: this.options,
|
||||||
queryKey: queryKey,
|
queryKey: queryKey,
|
||||||
@@ -423,7 +436,7 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
|
|
||||||
// Notify cache callback
|
// Notify cache callback
|
||||||
_cache.onData?.call(data, this);
|
_cache.onData?.call(data, this);
|
||||||
|
if (_completer?.isCompleted == false) _completer?.complete(data);
|
||||||
// Remove query after fetching if cache time is 0
|
// Remove query after fetching if cache time is 0
|
||||||
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
|
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
|
||||||
_optionalRemove();
|
_optionalRemove();
|
||||||
@@ -447,6 +460,9 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
|
if (this.cacheTime == null || this.cacheTime == Duration.zero) {
|
||||||
_optionalRemove();
|
_optionalRemove();
|
||||||
}
|
}
|
||||||
|
if (_completer?.isCompleted == false)
|
||||||
|
_completer?.completeError(
|
||||||
|
error ?? "Retry Failed", StackTrace.current);
|
||||||
},
|
},
|
||||||
onFail: (failureCount, error) {
|
onFail: (failureCount, error) {
|
||||||
_dispatch(Action(ActionType.failed));
|
_dispatch(Action(ActionType.failed));
|
||||||
@@ -461,8 +477,8 @@ class Query<TQueryFnData, TError, TData> {
|
|||||||
retryDelay: context.options.retryDelay,
|
retryDelay: context.options.retryDelay,
|
||||||
);
|
);
|
||||||
|
|
||||||
this._future = _retryer!.future;
|
this._completer = _retryer!.completer;
|
||||||
return this._future!;
|
return this._completer!.future;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _dispatch(Action<TData, TError> action) {
|
void _dispatch(Action<TData, TError> action) {
|
||||||
|
|||||||
@@ -86,8 +86,7 @@ class QueryClient {
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
TData? getQueryData<TData>(
|
TData? getQueryData<TData>(
|
||||||
QueryKey,
|
QueryKey queryKey, [
|
||||||
queryKey, [
|
|
||||||
QueryFilters? filters,
|
QueryFilters? filters,
|
||||||
]) {
|
]) {
|
||||||
return _queryCache
|
return _queryCache
|
||||||
@@ -357,13 +356,14 @@ class QueryClient {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
getMutationDefaults() {}
|
// getMutationDefaults() {}
|
||||||
setMutationDefaults() {}
|
// setMutationDefaults() {}
|
||||||
|
// getMutationCache() {}
|
||||||
|
|
||||||
QueryCache getQueryCache() {
|
QueryCache getQueryCache() {
|
||||||
return _queryCache;
|
return _queryCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
getMutationCache() {}
|
|
||||||
void clear() {
|
void clear() {
|
||||||
_queryCache.clear();
|
_queryCache.clear();
|
||||||
// _mutationCache.clear();
|
// _mutationCache.clear();
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ class Retryer<TData, TError> {
|
|||||||
late void Function() cancelRetry;
|
late void Function() cancelRetry;
|
||||||
late void Function() continueRetry;
|
late void Function() continueRetry;
|
||||||
late void Function() continueFn;
|
late void Function() continueFn;
|
||||||
late Future<TData> future;
|
// late Future<TData> future;
|
||||||
|
late Completer<TData> completer;
|
||||||
int failureCount;
|
int failureCount;
|
||||||
bool isPaused;
|
bool isPaused;
|
||||||
bool isResolved;
|
bool isResolved;
|
||||||
@@ -92,9 +93,9 @@ class Retryer<TData, TError> {
|
|||||||
|
|
||||||
this.continueFn = () => continueFn?.call();
|
this.continueFn = () => continueFn?.call();
|
||||||
|
|
||||||
Completer<TData> completer = Completer<TData>();
|
completer = Completer<TData>();
|
||||||
|
|
||||||
this.future = completer.future;
|
// this.future = completer.future;
|
||||||
|
|
||||||
resolve(value) {
|
resolve(value) {
|
||||||
if (!this.isResolved) {
|
if (!this.isResolved) {
|
||||||
@@ -115,11 +116,11 @@ class Retryer<TData, TError> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pause() {
|
pause() {
|
||||||
Completer completer = Completer();
|
Completer pauseCompleter = Completer();
|
||||||
if (!completer.isCompleted) continueFn = completer.complete;
|
if (!pauseCompleter.isCompleted) continueFn = pauseCompleter.complete;
|
||||||
this.isPaused = true;
|
this.isPaused = true;
|
||||||
onPause?.call();
|
onPause?.call();
|
||||||
return completer.future.then((val) {
|
return pauseCompleter.future.then((val) {
|
||||||
continueFn = null;
|
continueFn = null;
|
||||||
this.isPaused = false;
|
this.isPaused = false;
|
||||||
onContinue?.call();
|
onContinue?.call();
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:meta/meta.dart';
|
||||||
|
|
||||||
abstract class Subscribable<TListener extends Function> {
|
abstract class Subscribable<TListener extends Function> {
|
||||||
@protected
|
@protected
|
||||||
|
|||||||
@@ -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.dart';
|
||||||
import 'package:fl_query/src/core/query_key.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.
|
/// Default query keys hash function.
|
||||||
/// Dummy function just to fill the gaps for original react-query like
|
/// Dummy function just to fill the gaps for original react-query like
|
||||||
/// function body signatures
|
/// function body signatures
|
||||||
@@ -113,15 +103,15 @@ T replaceEqualDeep<T>(T a, T b) {
|
|||||||
|
|
||||||
bool isList = (a is Iterable && b is Iterable);
|
bool isList = (a is Iterable && b is Iterable);
|
||||||
if (isList || (a is Map && b is Map)) {
|
if (isList || (a is Map && b is Map)) {
|
||||||
var aSize = isList ? a.length : (a as Map).keys.length;
|
int aSize = isList ? a.length : (a as Map).keys.length;
|
||||||
var bItems = isList ? b : (b as Map).keys;
|
List bItems = (isList ? b : (b as Map).keys).toList();
|
||||||
var bSize = bItems.length;
|
int bSize = bItems.length;
|
||||||
var copy;
|
var copy;
|
||||||
|
|
||||||
int equalItems = 0;
|
int equalItems = 0;
|
||||||
|
|
||||||
for (int i = 0; i < bSize; i++) {
|
for (int i = 0; i < bSize; i++) {
|
||||||
var key = isList ? i : (bItems as Map)[i];
|
var key = isList ? i : bItems[i];
|
||||||
if (isList) {
|
if (isList) {
|
||||||
copy ??= [];
|
copy ??= [];
|
||||||
copy[key] = replaceEqualDeep((a as List)[key], (b as List)[key]);
|
copy[key] = replaceEqualDeep((a as List)[key], (b as List)[key]);
|
||||||
|
|||||||
@@ -5,11 +5,11 @@ homepage: https://github.com/KRTirtho/fl-query
|
|||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.15.1 <3.0.0"
|
sdk: ">=2.15.1 <3.0.0"
|
||||||
flutter: ">=1.17.0"
|
# flutter: ">=1.17.0"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
# flutter:
|
||||||
sdk: flutter
|
# sdk: flutter
|
||||||
meta: ^1.3.0
|
meta: ^1.3.0
|
||||||
path: ^1.8.0
|
path: ^1.8.0
|
||||||
hive: ^2.0.0
|
hive: ^2.0.0
|
||||||
@@ -27,4 +27,4 @@ dev_dependencies:
|
|||||||
lints: ^1.0.1
|
lints: ^1.0.1
|
||||||
|
|
||||||
# The following section is specific to Flutter.
|
# The following section is specific to Flutter.
|
||||||
flutter:
|
# flutter:
|
||||||
|
|||||||
Reference in New Issue
Block a user