refetch on external data change support added

This commit is contained in:
Kingkor Roy Tirtho
2022-07-05 09:28:43 +06:00
parent 5f8935a015
commit afa9933c91
5 changed files with 46 additions and 14 deletions
@@ -6,6 +6,7 @@ import 'package:flutter/material.dart';
final jobWithExternalData = QueryJob<String, double>( final jobWithExternalData = QueryJob<String, double>(
queryKey: "query-external-data", queryKey: "query-external-data",
cacheTime: const Duration(seconds: 10), cacheTime: const Duration(seconds: 10),
refetchOnExternalDataChange: false,
task: (queryKey, data) { task: (queryKey, data) {
return Future.delayed(const Duration(milliseconds: 500), return Future.delayed(const Duration(milliseconds: 500),
() => "Hello from $queryKey with $data"); () => "Hello from $queryKey with $data");
+15 -7
View File
@@ -75,13 +75,21 @@ Query<T, Outside> useQuery<T extends Object, Outside>({
} else if (oldExternalData != null && } else if (oldExternalData != null &&
externalData != null && externalData != null &&
!isShallowEqual(oldExternalData, externalData)) { !isShallowEqual(oldExternalData, externalData)) {
QueryBowl.of(context).fetchQuery( if (job.refetchOnExternalDataChange ??
job, queryBowl.refetchOnExternalDataChange) {
externalData: externalData, QueryBowl.of(context).fetchQuery(
onData: onData, job,
onError: onError, externalData: externalData,
key: uKey, onData: onData,
); onError: onError,
key: uKey,
);
} else {
QueryBowl.of(context)
.getQuery(job.queryKey)
?.setExternalData(externalData);
}
if (hasOnDataChanged) query.value.onDataListeners.remove(oldOnData); if (hasOnDataChanged) query.value.onDataListeners.remove(oldOnData);
if (hasOnErrorChanged) query.value.onErrorListeners.remove(oldOnError); if (hasOnErrorChanged) query.value.onErrorListeners.remove(oldOnError);
} else { } else {
@@ -32,6 +32,7 @@ class QueryJob<T extends Object, Outside> {
// got from global options // got from global options
bool? refetchOnMount; bool? refetchOnMount;
bool? refetchOnReconnect; bool? refetchOnReconnect;
bool? refetchOnExternalDataChange;
Duration? staleTime; Duration? staleTime;
Duration? cacheTime; Duration? cacheTime;
@@ -49,6 +50,7 @@ class QueryJob<T extends Object, Outside> {
this.refetchInterval, this.refetchInterval,
this.refetchOnMount, this.refetchOnMount,
this.refetchOnReconnect, this.refetchOnReconnect,
this.refetchOnExternalDataChange,
}) : _queryKey = queryKey; }) : _queryKey = queryKey;
String get queryKey => _queryKey; String get queryKey => _queryKey;
@@ -70,6 +72,7 @@ class QueryJob<T extends Object, Outside> {
Duration? refetchInterval, Duration? refetchInterval,
bool? refetchOnMount, bool? refetchOnMount,
bool? refetchOnReconnect, bool? refetchOnReconnect,
bool? refetchOnExternalDataChange,
}) { }) {
return (String queryKey) { return (String queryKey) {
if (preQueryKey != null) queryKey = "$preQueryKey#$queryKey"; if (preQueryKey != null) queryKey = "$preQueryKey#$queryKey";
@@ -85,6 +88,7 @@ class QueryJob<T extends Object, Outside> {
refetchInterval: refetchInterval, refetchInterval: refetchInterval,
refetchOnMount: refetchOnMount, refetchOnMount: refetchOnMount,
refetchOnReconnect: refetchOnReconnect, refetchOnReconnect: refetchOnReconnect,
refetchOnExternalDataChange: refetchOnExternalDataChange,
); );
}; };
} }
+12
View File
@@ -60,6 +60,13 @@ class QueryBowlScope extends StatefulWidget {
/// off by passing [Duration.zero] /// off by passing [Duration.zero]
final Duration refetchOnReconnectDelay; final Duration refetchOnReconnectDelay;
/// Refetch the query whenever the data passed as [externalData] to any
/// [QueryBuilder] or [useQuery] changes
///
/// If set to false than the [externalData] will get updated but there
/// won't be any query update
final bool refetchOnExternalDataChange;
/// used for periodically checking if any query got stale. /// used for periodically checking if any query got stale.
/// If none is supplied then half of the value of staleTime is used /// If none is supplied then half of the value of staleTime is used
final Duration refetchInterval; final Duration refetchInterval;
@@ -74,6 +81,7 @@ class QueryBowlScope extends StatefulWidget {
this.refetchOnReconnectDelay = const Duration(milliseconds: 100), this.refetchOnReconnectDelay = const Duration(milliseconds: 100),
this.refetchOnApplicationResume = true, this.refetchOnApplicationResume = true,
this.refetchOnWindowFocus = true, this.refetchOnWindowFocus = true,
this.refetchOnExternalDataChange = false,
Key? key, Key? key,
}) : super(key: key); }) : super(key: key);
@@ -218,6 +226,7 @@ class _QueryBowlScopeState extends State<QueryBowlScope> {
refetchInterval: widget.refetchInterval, refetchInterval: widget.refetchInterval,
refetchOnMount: widget.refetchOnMount, refetchOnMount: widget.refetchOnMount,
refetchOnReconnect: widget.refetchOnReconnect, refetchOnReconnect: widget.refetchOnReconnect,
refetchOnExternalDataChange: widget.refetchOnExternalDataChange,
child: widget.child, child: widget.child,
); );
} }
@@ -237,6 +246,7 @@ class QueryBowl extends InheritedWidget {
final Duration? refetchInterval; final Duration? refetchInterval;
final bool refetchOnMount; final bool refetchOnMount;
final bool refetchOnReconnect; final bool refetchOnReconnect;
final bool refetchOnExternalDataChange;
final void Function<T extends Object, Outside>(Query<T, Outside> query) final void Function<T extends Object, Outside>(Query<T, Outside> query)
_addQuery; _addQuery;
@@ -263,6 +273,7 @@ class QueryBowl extends InheritedWidget {
required this.clear, required this.clear,
required this.refetchOnMount, required this.refetchOnMount,
required this.refetchOnReconnect, required this.refetchOnReconnect,
required this.refetchOnExternalDataChange,
this.refetchInterval, this.refetchInterval,
Key? key, Key? key,
}) : _addQuery = addQuery, }) : _addQuery = addQuery,
@@ -296,6 +307,7 @@ class QueryBowl extends InheritedWidget {
if (onError != null) prevQuery.onErrorListeners.add(onError); if (onError != null) prevQuery.onErrorListeners.add(onError);
if (!prevQuery.hasData || hasExternalDataChanged) { if (!prevQuery.hasData || hasExternalDataChanged) {
if (hasExternalDataChanged) prevQuery.setExternalData(externalData); if (hasExternalDataChanged) prevQuery.setExternalData(externalData);
return await prevQuery.refetch(); return await prevQuery.refetch();
} }
// mounting the widget that is using the query in the prevQuery // mounting the widget that is using the query in the prevQuery
+14 -7
View File
@@ -77,13 +77,20 @@ class _QueryBuilderState<T extends Object, Outside>
} else if (oldWidget.externalData != null && } else if (oldWidget.externalData != null &&
widget.externalData != null && widget.externalData != null &&
!isShallowEqual(oldWidget.externalData!, widget.externalData!)) { !isShallowEqual(oldWidget.externalData!, widget.externalData!)) {
QueryBowl.of(context).fetchQuery( if (widget.job.refetchOnExternalDataChange ??
widget.job, queryBowl.refetchOnExternalDataChange) {
externalData: widget.externalData, QueryBowl.of(context).fetchQuery(
onData: widget.onData, widget.job,
onError: widget.onError, externalData: widget.externalData,
key: uKey, onData: widget.onData,
); onError: widget.onError,
key: uKey,
);
} else {
QueryBowl.of(context)
.getQuery(widget.job.queryKey)
?.setExternalData(widget.externalData);
}
if (hasOnDataChanged) query?.onDataListeners.remove(oldWidget.onData); if (hasOnDataChanged) query?.onDataListeners.remove(oldWidget.onData);
if (hasOnErrorChanged) query?.onErrorListeners.remove(oldWidget.onError); if (hasOnErrorChanged) query?.onErrorListeners.remove(oldWidget.onError);
} else { } else {