fix: refetchOnExternalDataChange isn't working #18

This commit is contained in:
Kingkor Roy Tirtho
2022-12-14 14:06:40 +06:00
parent 6676f508ae
commit a7c03f891f
25 changed files with 183 additions and 172 deletions
@@ -42,6 +42,9 @@ InfiniteQuery<T, Outside, PageParam>
final oldOnError = usePrevious(onError);
final init = useCallback(([T? previousData]) {
final hasExternalDataChanged = !isShallowEqual(
infiniteQuery.value.externalData,
infiniteQuery.value.prevUsedExternalData);
infiniteQuery.value = queryBowl.addInfiniteQuery<T, Outside, PageParam>(
job,
externalData: externalData,
@@ -50,10 +53,6 @@ InfiniteQuery<T, Outside, PageParam>
onError: onError,
);
update();
final hasExternalDataChanged = infiniteQuery.value.externalData != null &&
infiniteQuery.value.prevUsedExternalData != null &&
!isShallowEqual(infiniteQuery.value.externalData!,
infiniteQuery.value.prevUsedExternalData!);
if (infiniteQuery.value.fetched && hasExternalDataChanged) {
infiniteQuery.value.refetchPages();
} else if (!infiniteQuery.value.fetched) {
@@ -95,42 +94,42 @@ InfiniteQuery<T, Outside, PageParam>
}, []);
useEffect(() {
final hasOnErrorChanged = oldOnError != onError && oldOnError != null;
final hasOnDataChanged = oldOnData != onData && oldOnData != null;
if (oldJob != null && oldJob.queryKey != job.queryKey) {
disposeQuery();
init();
} else if (oldExternalData != null &&
externalData != null &&
!isShallowEqual(oldExternalData, externalData)) {
if (job.refetchOnExternalDataChange ??
queryBowl.refetchOnExternalDataChange) {
QueryBowl.of(context).addInfiniteQuery(
job,
externalData: externalData,
key: uKey,
onData: onData,
onError: onError,
)..refetchPages();
} else {
QueryBowl.of(context)
.getQuery(job.queryKey)
?.setExternalData(externalData);
}
WidgetsBinding.instance.addPostFrameCallback((_) {
final hasOnErrorChanged = oldOnError != onError && oldOnError != null;
final hasOnDataChanged = oldOnData != onData && oldOnData != null;
if (oldJob != null && oldJob.queryKey != job.queryKey) {
disposeQuery();
init();
} else if (!isShallowEqual(oldExternalData, externalData)) {
if (job.refetchOnExternalDataChange ??
queryBowl.refetchOnExternalDataChange) {
QueryBowl.of(context).addInfiniteQuery(
job,
externalData: externalData,
key: uKey,
onData: onData,
onError: onError,
)..refetchPages();
} else {
QueryBowl.of(context)
.getQuery(job.queryKey)
?.setExternalData(externalData);
}
if (hasOnDataChanged) infiniteQuery.value.removeDataListener(oldOnData);
if (hasOnErrorChanged)
infiniteQuery.value.removeErrorListener(oldOnError);
} else {
if (hasOnDataChanged) {
infiniteQuery.value.removeDataListener(oldOnData);
if (onData != null) infiniteQuery.value.addDataListener(onData);
if (hasOnDataChanged) infiniteQuery.value.removeDataListener(oldOnData);
if (hasOnErrorChanged)
infiniteQuery.value.removeErrorListener(oldOnError);
} else {
if (hasOnDataChanged) {
infiniteQuery.value.removeDataListener(oldOnData);
if (onData != null) infiniteQuery.value.addDataListener(onData);
}
if (hasOnErrorChanged) {
infiniteQuery.value.removeErrorListener(oldOnError);
if (onError != null) infiniteQuery.value.addErrorListener(onError);
}
}
if (hasOnErrorChanged) {
infiniteQuery.value.removeErrorListener(oldOnError);
if (onError != null) infiniteQuery.value.addErrorListener(onError);
}
}
});
return null;
});
@@ -75,23 +75,25 @@ Mutation<T, V> useMutation<T extends Object, V>({
}, []);
useEffect(() {
if (oldJob != null && oldJob.mutationKey != job.mutationKey) {
disposeMutation();
init();
} else {
if (oldOnData != onData && oldOnData != null) {
mutation.value.removeDataListener(oldOnData);
if (onData != null) mutation.value.addDataListener(onData);
WidgetsBinding.instance.addPostFrameCallback((_) {
if (oldJob != null && oldJob.mutationKey != job.mutationKey) {
disposeMutation();
init();
} else {
if (oldOnData != onData && oldOnData != null) {
mutation.value.removeDataListener(oldOnData);
if (onData != null) mutation.value.addDataListener(onData);
}
if (oldOnError != onError && oldOnError != null) {
mutation.value.removeErrorListener(oldOnError);
if (onError != null) mutation.value.addErrorListener(onError);
}
if (oldOnMutate != onMutate && oldOnMutate != null) {
mutation.value.removeMutateListener(oldOnMutate);
if (onMutate != null) mutation.value.addMutateListener(onMutate);
}
}
if (oldOnError != onError && oldOnError != null) {
mutation.value.removeErrorListener(oldOnError);
if (onError != null) mutation.value.addErrorListener(onError);
}
if (oldOnMutate != onMutate && oldOnMutate != null) {
mutation.value.removeMutateListener(oldOnMutate);
if (onMutate != null) mutation.value.addMutateListener(onMutate);
}
}
});
return null;
});
+46 -46
View File
@@ -41,6 +41,10 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
final oldOnError = usePrevious(onError);
final init = useCallback(([T? previousData]) {
final hasExternalDataChanged = !isShallowEqual(
query.value.externalData,
query.value.prevUsedExternalData,
);
query.value = queryBowl.addQuery<T, Outside>(
job,
externalData: externalData,
@@ -50,10 +54,6 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
onError: onError,
);
update();
final hasExternalDataChanged = query.value.externalData != null &&
query.value.prevUsedExternalData != null &&
!isShallowEqual(
query.value.externalData!, query.value.prevUsedExternalData!);
if (query.value.fetched && hasExternalDataChanged) {
query.value.refetch();
} else if (!query.value.fetched) {
@@ -82,51 +82,51 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
}, []);
useEffect(() {
final hasOnErrorChanged = oldOnError != onError && oldOnError != null;
final hasOnDataChanged = oldOnData != onData && oldOnData != null;
if (oldJob != null && oldJob.queryKey != job.queryKey) {
disposeQuery();
WidgetsBinding.instance.addPostFrameCallback((_) {
final hasOnErrorChanged = oldOnError != onError && oldOnError != null;
final hasOnDataChanged = oldOnData != onData && oldOnData != null;
if (oldJob != null && oldJob.queryKey != job.queryKey) {
disposeQuery();
/// setting the new query's initial data as prev query's data
/// when [job.keepPreviousData] is true and both are dynamic
if (oldJob.isDynamic &&
job.isDynamic &&
oldJob.keepPreviousData == true &&
job.keepPreviousData == true) {
init(query.value.data);
} else {
init();
}
} else if (oldExternalData != null &&
externalData != null &&
!isShallowEqual(oldExternalData, externalData)) {
if (job.refetchOnExternalDataChange ??
queryBowl.refetchOnExternalDataChange) {
QueryBowl.of(context).fetchQuery(
job,
externalData: externalData,
onData: onData,
onError: onError,
key: uKey,
);
} else {
QueryBowl.of(context)
.getQuery(job.queryKey)
?.setExternalData(externalData);
}
/// setting the new query's initial data as prev query's data
/// when [job.keepPreviousData] is true and both are dynamic
if (oldJob.isDynamic &&
job.isDynamic &&
oldJob.keepPreviousData == true &&
job.keepPreviousData == true) {
init(query.value.data);
} else {
init();
}
} else if (!isShallowEqual(oldExternalData, externalData)) {
if (job.refetchOnExternalDataChange ??
queryBowl.refetchOnExternalDataChange) {
QueryBowl.of(context).fetchQuery(
job,
externalData: externalData,
onData: onData,
onError: onError,
key: uKey,
);
} else {
QueryBowl.of(context)
.getQuery(job.queryKey)
?.setExternalData(externalData);
}
if (hasOnDataChanged) query.value.removeDataListener(oldOnData);
if (hasOnErrorChanged) query.value.removeErrorListener(oldOnError);
} else {
if (hasOnDataChanged) {
query.value.removeDataListener(oldOnData);
if (onData != null) query.value.addDataListener(onData);
if (hasOnDataChanged) query.value.removeDataListener(oldOnData);
if (hasOnErrorChanged) query.value.removeErrorListener(oldOnError);
} else {
if (hasOnDataChanged) {
query.value.removeDataListener(oldOnData);
if (onData != null) query.value.addDataListener(onData);
}
if (hasOnErrorChanged) {
query.value.removeErrorListener(oldOnError);
if (onError != null) query.value.addErrorListener(onError);
}
}
if (hasOnErrorChanged) {
query.value.removeErrorListener(oldOnError);
if (onError != null) query.value.addErrorListener(onError);
}
}
});
return null;
});
@@ -0,0 +1,9 @@
import 'package:fl_query/fl_query.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
/// Simple hook based shorthand for [QueryBowl.of(context)]
QueryBowl useQueryBowl() {
final context = useContext();
return QueryBowl.of(context);
}