feat: add initial support for InfiniteQuery

Added new infinite query class with it's own builder widget and integration with query_bowl
The `cast` method used in mutation and query are now a mixin instead of BasicOperation property
This commit is contained in:
Kingkor Roy Tirtho
2022-08-21 20:10:40 +06:00
parent 0c2eae1f11
commit 1452d7d79e
25 changed files with 563 additions and 32 deletions
@@ -0,0 +1,67 @@
import 'package:fl_query/src/infinite_query.dart';
import 'package:fl_query/src/models/infinite_query_job.dart';
import 'package:fl_query/src/query_bowl.dart';
import 'package:fl_query/src/utils.dart';
import 'package:flutter/widgets.dart';
class InfiniteQueryBuilder<T extends Object, Outside, PageParam extends Object>
extends StatefulWidget {
final Function(
BuildContext context,
InfiniteQuery<T, Outside, PageParam> query,
) builder;
final InfiniteQueryJob<T, Outside, PageParam> job;
final Outside externalData;
InfiniteQueryBuilder({
required this.job,
required this.builder,
required this.externalData,
Key? key,
}) : super(key: key);
@override
State<InfiniteQueryBuilder<T, Outside, PageParam>> createState() =>
_InfiniteQueryBuilderState<T, Outside, PageParam>();
}
class _InfiniteQueryBuilderState<T extends Object, Outside,
PageParam extends Object>
extends State<InfiniteQueryBuilder<T, Outside, PageParam>> {
InfiniteQuery<T, Outside, PageParam>? infiniteQuery;
late QueryBowl queryBowl;
late final ValueKey<String> uKey;
@override
void initState() {
super.initState();
uKey = ValueKey<String>(uuid.v4());
WidgetsBinding.instance.addPostFrameCallback((_) => init());
}
void init([T? previousData]) async {
final bowl = QueryBowl.of(context);
infiniteQuery = bowl.addInfiniteQuery<T, Outside, PageParam>(
widget.job,
externalData: widget.externalData,
key: uKey,
);
// final hasExternalDataChanged = infiniteQuery!.externalData != null &&
// infiniteQuery!.prevUsedExternalData != null &&
// !isShallowEqual(infiniteQuery!.externalData!, infiniteQuery!.prevUsedExternalData!);
// if (infiniteQuery!.fetched && hasExternalDataChanged) {
// await infiniteQuery!.refetch();
// } else if (!infiniteQuery!.fetched) {
await infiniteQuery!.fetch();
// }
}
@override
Widget build(BuildContext context) {
queryBowl = QueryBowl.of(context);
final latestInfiniteQuery = queryBowl
.getInfiniteQuery<T, Outside, PageParam>(widget.job.queryKey) ??
infiniteQuery;
if (latestInfiniteQuery == null) return Container();
return widget.builder(context, latestInfiniteQuery);
}
}