Query & Mutation Builders now doesn't create a new instance

This commit is contained in:
Kingkor Roy Tirtho
2022-07-12 03:15:44 +06:00
parent 89272d5c00
commit 88841e71f8
10 changed files with 40 additions and 27 deletions
+2
View File
@@ -0,0 +1,2 @@
.vscode/dryrun.log
.vscode/configurationCache.log
@@ -21,7 +21,6 @@ abstract class BaseOperation<Data, StatusType> extends ChangeNotifier {
int retryAttempts = 0; int retryAttempts = 0;
DateTime updatedAt; DateTime updatedAt;
@protected
bool fetched = false; bool fetched = false;
/// used for keeping track of query activity. If the are no mounts & /// used for keeping track of query activity. If the are no mounts &
+6
View File
@@ -168,4 +168,10 @@ class Mutation<T extends Object, V> extends BaseOperation<T, MutationStatus> {
bool get isLoading => status == MutationStatus.loading; bool get isLoading => status == MutationStatus.loading;
@override @override
bool get isSuccess => status == MutationStatus.success; bool get isSuccess => status == MutationStatus.success;
@override
bool operator ==(other) {
return (other is Mutation<T, V> && other.mutationKey == mutationKey) ||
identical(other, this);
}
} }
@@ -51,7 +51,7 @@ class _MutationBuilderState<T extends Object, V>
void init([_]) { void init([_]) {
queryBowl = QueryBowl.of(context); queryBowl = QueryBowl.of(context);
mutation = queryBowl.addMutation<T, V>( mutation = queryBowl.addMutation<T, V>(
Mutation<T, V>.fromOptions(widget.job, queryBowl: queryBowl), widget.job,
onData: widget.onData, onData: widget.onData,
onError: widget.onError, onError: widget.onError,
onMutate: widget.onMutate, onMutate: widget.onMutate,
+6
View File
@@ -322,4 +322,10 @@ class Query<T extends Object, Outside> extends BaseOperation<T, QueryStatus> {
String toString() { String toString() {
return debugLabel; return debugLabel;
} }
@override
bool operator ==(other) {
return (other is Query<T, Outside> && other.queryKey == queryKey) ||
identical(other, this);
}
} }
+18 -7
View File
@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:connectivity_plus/connectivity_plus.dart'; import 'package:connectivity_plus/connectivity_plus.dart';
import 'package:fl_query/src/models/mutation_job.dart';
import 'package:fl_query/src/models/query_job.dart'; import 'package:fl_query/src/models/query_job.dart';
import 'package:fl_query/src/mutation.dart'; import 'package:fl_query/src/mutation.dart';
import 'package:fl_query/src/mutation_builder.dart'; import 'package:fl_query/src/mutation_builder.dart';
@@ -334,23 +335,24 @@ class QueryBowl extends InheritedWidget {
/// !⚠️**Warning** only for internal library usage /// !⚠️**Warning** only for internal library usage
@protected @protected
Query<T, Outside> addQuery<T extends Object, Outside>( Query<T, Outside> addQuery<T extends Object, Outside>(
Query<T, Outside> query, { QueryJob<T, Outside> queryJob, {
required Outside externalData,
required ValueKey<String> key, required ValueKey<String> key,
final QueryListener<T>? onData, final QueryListener<T>? onData,
final QueryListener<dynamic>? onError, final QueryListener<dynamic>? onError,
}) { }) {
final prevQuery = final prevQuery =
_queries.firstWhereOrNull((q) => q.queryKey == query.queryKey); _queries.firstWhereOrNull((q) => q.queryKey == queryJob.queryKey);
if (prevQuery is Query<T, Outside>) { if (prevQuery is Query<T, Outside>) {
// run the query if its still not called or if externalData has // run the query if its still not called or if externalData has
// changed // changed
if (prevQuery.prevUsedExternalData != null && if (prevQuery.prevUsedExternalData != null &&
query.externalData != null && externalData != null &&
!isShallowEqual( !isShallowEqual(
prevQuery.prevUsedExternalData!, prevQuery.prevUsedExternalData!,
query.externalData!, externalData,
)) { )) {
prevQuery.setExternalData(query.externalData); prevQuery.setExternalData(externalData);
} }
prevQuery.mount(key); prevQuery.mount(key);
if (onData != null) prevQuery.onDataListeners.add(onData); if (onData != null) prevQuery.onDataListeners.add(onData);
@@ -358,6 +360,11 @@ class QueryBowl extends InheritedWidget {
// mounting the widget that is using the query in the prevQuery // mounting the widget that is using the query in the prevQuery
return prevQuery; return prevQuery;
} }
final query = Query<T, Outside>.fromOptions(
queryJob,
externalData: externalData,
queryBowl: this,
);
if (onData != null) query.onDataListeners.add(onData); if (onData != null) query.onDataListeners.add(onData);
if (onError != null) query.onErrorListeners.add(onError); if (onError != null) query.onErrorListeners.add(onError);
query.updateDefaultOptions( query.updateDefaultOptions(
@@ -375,14 +382,14 @@ class QueryBowl extends InheritedWidget {
/// !⚠️**Warning** only for internal library usage /// !⚠️**Warning** only for internal library usage
@protected @protected
Mutation<T, V> addMutation<T extends Object, V>( Mutation<T, V> addMutation<T extends Object, V>(
Mutation<T, V> mutation, { MutationJob<T, V> mutationJob, {
final MutationListener<T>? onData, final MutationListener<T>? onData,
final MutationListener<dynamic>? onError, final MutationListener<dynamic>? onError,
final MutationListener<V>? onMutate, final MutationListener<V>? onMutate,
required ValueKey<String> key, required ValueKey<String> key,
}) { }) {
final prevMutation = _mutations.firstWhereOrNull( final prevMutation = _mutations.firstWhereOrNull(
(prevMutation) => prevMutation.mutationKey == mutation.mutationKey); (prevMutation) => prevMutation.mutationKey == mutationJob.mutationKey);
if (prevMutation != null && prevMutation is Mutation<T, V>) { if (prevMutation != null && prevMutation is Mutation<T, V>) {
if (onData != null) prevMutation.onDataListeners.add(onData); if (onData != null) prevMutation.onDataListeners.add(onData);
if (onError != null) prevMutation.onErrorListeners.add(onError); if (onError != null) prevMutation.onErrorListeners.add(onError);
@@ -390,6 +397,10 @@ class QueryBowl extends InheritedWidget {
prevMutation.mount(key); prevMutation.mount(key);
return prevMutation; return prevMutation;
} else { } else {
final mutation = Mutation<T, V>.fromOptions(
mutationJob,
queryBowl: this,
);
if (onData != null) mutation.onDataListeners.add(onData); if (onData != null) mutation.onDataListeners.add(onData);
if (onError != null) mutation.onErrorListeners.add(onError); if (onError != null) mutation.onErrorListeners.add(onError);
if (onMutate != null) mutation.onMutateListeners.add(onMutate); if (onMutate != null) mutation.onMutateListeners.add(onMutate);
+2 -5
View File
@@ -46,11 +46,8 @@ class _QueryBuilderState<T extends Object, Outside>
void init([QueryBowl? bowl]) async { void init([QueryBowl? bowl]) async {
bowl ??= QueryBowl.of(context); bowl ??= QueryBowl.of(context);
query = bowl.addQuery<T, Outside>( query = bowl.addQuery<T, Outside>(
Query<T, Outside>.fromOptions( widget.job,
widget.job, externalData: widget.externalData,
externalData: widget.externalData,
queryBowl: QueryBowl.of(context),
),
key: uKey, key: uKey,
onData: widget.onData, onData: widget.onData,
onError: widget.onError, onError: widget.onError,
@@ -1 +1 @@
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.5/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.5/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.4/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]}],"windows":[{"name":"connectivity_plus_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus_web","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.2/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]}],"date_created":"2022-07-08 04:37:56.711440","version":"3.0.1"} {"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.5/","native_build":true,"dependencies":[]}],"android":[{"name":"connectivity_plus","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus-2.3.5/","native_build":true,"dependencies":[]}],"macos":[{"name":"connectivity_plus_macos","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_macos-1.2.4/","native_build":true,"dependencies":[]}],"linux":[{"name":"connectivity_plus_linux","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_linux-1.3.1/","native_build":false,"dependencies":[]}],"windows":[{"name":"connectivity_plus_windows","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_windows-1.2.2/","native_build":true,"dependencies":[]}],"web":[{"name":"connectivity_plus_web","path":"/home/krtirtho/.pub-cache/hosted/pub.dartlang.org/connectivity_plus_web-1.2.2/","dependencies":[]}]},"dependencyGraph":[{"name":"connectivity_plus","dependencies":["connectivity_plus_linux","connectivity_plus_macos","connectivity_plus_web","connectivity_plus_windows"]},{"name":"connectivity_plus_linux","dependencies":[]},{"name":"connectivity_plus_macos","dependencies":[]},{"name":"connectivity_plus_web","dependencies":[]},{"name":"connectivity_plus_windows","dependencies":[]}],"date_created":"2022-07-12 03:10:11.860962","version":"3.0.1"}
@@ -27,7 +27,7 @@ Mutation<T, V> useMutation<T extends Object, V>({
final init = useCallback(() { final init = useCallback(() {
mutation.value = queryBowl.addMutation<T, V>( mutation.value = queryBowl.addMutation<T, V>(
mutation.value, job,
onData: onData, onData: onData,
onError: onError, onError: onError,
onMutate: onMutate, onMutate: onMutate,
@@ -55,10 +55,6 @@ Mutation<T, V> useMutation<T extends Object, V>({
useEffect(() { useEffect(() {
if (oldJob != null && oldJob.mutationKey != job.mutationKey) { if (oldJob != null && oldJob.mutationKey != job.mutationKey) {
disposeMutation(); disposeMutation();
mutation.value = Mutation<T, V>.fromOptions(
job,
queryBowl: queryBowl,
);
init(); init();
} else { } else {
if (oldOnData != onData && oldOnData != null) { if (oldOnData != onData && oldOnData != null) {
@@ -33,7 +33,8 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
final init = useCallback(() { final init = useCallback(() {
query.value = queryBowl.addQuery<T, Outside>( query.value = queryBowl.addQuery<T, Outside>(
query.value, job,
externalData: externalData,
key: uKey, key: uKey,
onData: onData, onData: onData,
onError: onError, onError: onError,
@@ -46,7 +47,7 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
hasExternalDataChanged hasExternalDataChanged
? query.value.refetch() ? query.value.refetch()
: query.value.fetch(); : query.value.fetch();
}, [queryBowl, query.value, uKey, onData, onError, job]); }, [queryBowl, query.value, uKey, onData, onError, job, externalData]);
final disposeQuery = useCallback(() { final disposeQuery = useCallback(() {
query.value.unmount(uKey); query.value.unmount(uKey);
@@ -64,11 +65,6 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
final hasOnDataChanged = oldOnData != onData && oldOnData != null; final hasOnDataChanged = oldOnData != onData && oldOnData != null;
if (oldJob != null && oldJob.queryKey != job.queryKey) { if (oldJob != null && oldJob.queryKey != job.queryKey) {
disposeQuery(); disposeQuery();
query.value = Query.fromOptions(
job,
externalData: externalData,
queryBowl: queryBowl,
);
init(); init();
} else if (oldExternalData != null && } else if (oldExternalData != null &&
externalData != null && externalData != null &&