removed dependOnQuery from beacuse of infinite renders

example created for various usecases with various features
hooks now use standard hook API instead of using Hook Class
variable query & mutation not working bug fix
mutation onMutate listeners not getting called bug fix
This commit is contained in:
Kingkor Roy Tirtho
2022-06-24 12:51:27 +06:00
parent 2ead7fd2be
commit d8024714cd
27 changed files with 1117 additions and 680 deletions
+33 -23
View File
@@ -5,7 +5,7 @@ import 'package:fl_query/src/utils.dart';
import 'package:flutter/widgets.dart';
class QueryBuilder<T extends Object, Outside> extends StatefulWidget {
final Function(BuildContext, Query<T, Outside>) builder;
final Function(BuildContext context, Query<T, Outside> query) builder;
final QueryJob<T, Outside> job;
final Outside externalData;
@@ -40,30 +40,36 @@ class _QueryBuilderState<T extends Object, Outside>
void initState() {
super.initState();
uKey = ValueKey<String>(uuid.v4());
WidgetsBinding.instance.addPostFrameCallback((_) async {
query = QueryBowl.of(context).addQuery<T, Outside>(
Query<T, Outside>.fromOptions(
widget.job,
externalData: widget.externalData,
queryBowl: QueryBowl.of(context),
),
key: uKey,
onData: widget.onData,
onError: widget.onError,
);
final hasExternalDataChanged = query!.externalData != null &&
query!.prevUsedExternalData != null &&
!isShallowEqual(query!.externalData!, query!.prevUsedExternalData!);
(query!.fetched && query!.refetchOnMount == true) ||
hasExternalDataChanged
? await query!.refetch()
: await query!.fetch();
});
WidgetsBinding.instance.addPostFrameCallback((_) => init());
}
void init([QueryBowl? bowl]) async {
bowl ??= QueryBowl.of(context);
query = bowl.addQuery<T, Outside>(
Query<T, Outside>.fromOptions(
widget.job,
externalData: widget.externalData,
queryBowl: QueryBowl.of(context),
),
key: uKey,
onData: widget.onData,
onError: widget.onError,
);
final hasExternalDataChanged = query!.externalData != null &&
query!.prevUsedExternalData != null &&
!isShallowEqual(query!.externalData!, query!.prevUsedExternalData!);
(query!.fetched && query!.refetchOnMount == true) || hasExternalDataChanged
? await query!.refetch()
: await query!.fetch();
}
@override
void didUpdateWidget(covariant oldWidget) {
if (oldWidget.externalData != null &&
// re-init the query-builder when new queryJob is appended
if (oldWidget.job.queryKey != widget.job.queryKey) {
_queryDispose();
init();
} else if (oldWidget.externalData != null &&
widget.externalData != null &&
!isShallowEqual(oldWidget.externalData!, widget.externalData!)) {
QueryBowl.of(context).fetchQuery(
@@ -87,11 +93,15 @@ class _QueryBuilderState<T extends Object, Outside>
super.didUpdateWidget(oldWidget);
}
@override
void dispose() {
_queryDispose() {
query?.unmount(uKey);
if (widget.onData != null) query?.onDataListeners.remove(widget.onData);
if (widget.onError != null) query?.onErrorListeners.remove(widget.onError);
}
@override
void dispose() {
_queryDispose();
super.dispose();
}