query reusability by QueryJob
QueryJob.task External Data Support Query task is now pure function Query.data is non-nullable (even the type)
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:fl_query/models/query_job.dart';
|
||||
import 'package:fl_query/query.dart';
|
||||
import 'package:collection/collection.dart';
|
||||
import 'package:flutter/widgets.dart';
|
||||
@@ -73,7 +74,7 @@ class _QueryBowlScopeState extends State<QueryBowlScope> {
|
||||
});
|
||||
}
|
||||
|
||||
void addQuery(Query query) {
|
||||
void addQuery<T extends Object, Outside>(Query<T, Outside> query) {
|
||||
setState(() {
|
||||
queries = Set.from({...queries, query});
|
||||
});
|
||||
@@ -81,9 +82,9 @@ class _QueryBowlScopeState extends State<QueryBowlScope> {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
_disposeListeners();
|
||||
_listenToQueryUpdate();
|
||||
return QueryBowl(
|
||||
onUpdate: updateQueries,
|
||||
addQuery: addQuery,
|
||||
queries: queries,
|
||||
staleTime: widget.staleTime,
|
||||
@@ -98,12 +99,14 @@ class QueryBowl extends InheritedWidget {
|
||||
final Set<Query> _queries;
|
||||
final Duration staleTime;
|
||||
|
||||
final void Function(Query query) _addQuery;
|
||||
final void Function<T extends Object, Outside>(Query<T, Outside> query)
|
||||
_addQuery;
|
||||
|
||||
const QueryBowl({
|
||||
required Widget child,
|
||||
required final void Function() onUpdate,
|
||||
required final void Function(Query query) addQuery,
|
||||
required final void Function<T extends Object, Outside>(
|
||||
Query<T, Outside> query)
|
||||
addQuery,
|
||||
required final Set<Query> queries,
|
||||
required this.staleTime,
|
||||
Key? key,
|
||||
@@ -111,25 +114,33 @@ class QueryBowl extends InheritedWidget {
|
||||
_queries = queries,
|
||||
super(child: child, key: key);
|
||||
|
||||
Future<T?> fetchQuery<T>(Query<T> query) async {
|
||||
Future<T?> fetchQuery<T extends Object, Outside>(QueryJob<T, Outside> options,
|
||||
{required Outside externalData}) async {
|
||||
final prevQuery =
|
||||
_queries.firstWhereOrNull((q) => q.queryKey == query.queryKey);
|
||||
if (prevQuery is Query<T>) {
|
||||
if (!prevQuery.hasData) {
|
||||
_queries.firstWhereOrNull((q) => q.queryKey == options.queryKey);
|
||||
if (prevQuery is Query<T, Outside>) {
|
||||
// run the query if its still not called or if externalData has
|
||||
// changed
|
||||
final hasExternalDataChanged =
|
||||
prevQuery.prevUsedExternalData != externalData;
|
||||
if (!prevQuery.hasData || hasExternalDataChanged) {
|
||||
if (hasExternalDataChanged) prevQuery.setExternalData(externalData);
|
||||
return prevQuery.fetched
|
||||
? await prevQuery.refetch()
|
||||
: await prevQuery.fetch();
|
||||
}
|
||||
return prevQuery.data;
|
||||
}
|
||||
_addQuery(query);
|
||||
final query =
|
||||
Query<T, Outside>.fromOptions(options, externalData: externalData);
|
||||
_addQuery<T, Outside>(query);
|
||||
return await query.fetch();
|
||||
}
|
||||
|
||||
Query<T>? getQuery<T>(String queryKey) {
|
||||
return _queries.firstWhereOrNull(
|
||||
(query) => query.queryKey == queryKey && query is Query<T>)
|
||||
as Query<T>?;
|
||||
Query<T, Outside>? getQuery<T extends Object, Outside>(String queryKey) {
|
||||
return _queries.firstWhereOrNull((query) {
|
||||
return query.queryKey == queryKey && query is Query<T, Outside>;
|
||||
})?.cast<Query<T, Outside>>();
|
||||
}
|
||||
|
||||
int get isFetching {
|
||||
|
||||
Reference in New Issue
Block a user