refetch on external data change support added
This commit is contained in:
@@ -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");
|
||||||
|
|||||||
@@ -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,
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user