chore: more comment and 1 level deep BuildContext

This commit is contained in:
Kingkor Roy Tirtho
2023-06-10 12:12:49 +06:00
parent c6e484637a
commit 7dd9036e69
7 changed files with 53 additions and 41 deletions
@@ -334,6 +334,8 @@ class InfiniteQuery<DataType, ErrorType, PageType>
/// ///
/// This is internally used to update queryFn when external data /// This is internally used to update queryFn when external data
/// has changed. Used by [InfiniteQueryBuilder] and [QueryClient] /// has changed. Used by [InfiniteQueryBuilder] and [QueryClient]
///
/// This can also refresh if [RefreshConfig.refreshOnQueryFnChange] is true
void updateQueryFn(InfiniteQueryFn<DataType, PageType> queryFn) { void updateQueryFn(InfiniteQueryFn<DataType, PageType> queryFn) {
if (_queryFn == queryFn) return; if (_queryFn == queryFn) return;
_queryFn = queryFn; _queryFn = queryFn;
@@ -29,7 +29,11 @@ class InfiniteQueryBuilder<DataType, ErrorType, PageType>
final ValueChanged<PageEvent<DataType, PageType>>? onData; final ValueChanged<PageEvent<DataType, PageType>>? onData;
final ValueChanged<PageEvent<ErrorType, PageType>>? onError; final ValueChanged<PageEvent<ErrorType, PageType>>? onError;
// widget specific /// Toggle to fetch data on initial load or not
///
/// This is useful when you want to fetch data manually after certain action
///
/// Once user manually fetch data, this will be set to true internally
final bool enabled; final bool enabled;
final InfiniteQueryBuilderFn<DataType, ErrorType, PageType> builder; final InfiniteQueryBuilderFn<DataType, ErrorType, PageType> builder;
@@ -66,9 +70,9 @@ class _InfiniteQueryBuilderState<DataType, ErrorType, PageType>
StreamSubscription<PageEvent<DataType, PageType>>? dataSubscription; StreamSubscription<PageEvent<DataType, PageType>>? dataSubscription;
StreamSubscription<PageEvent<ErrorType, PageType>>? errorSubscription; StreamSubscription<PageEvent<ErrorType, PageType>>? errorSubscription;
Future<void> initialize() async { Future<void> initialize(QueryClient client) async {
setState(() { setState(() {
_createQuery(); _createQuery(client);
if (widget.onData != null) if (widget.onData != null)
dataSubscription = query!.dataStream.listen(widget.onData); dataSubscription = query!.dataStream.listen(widget.onData);
@@ -82,8 +86,8 @@ class _InfiniteQueryBuilderState<DataType, ErrorType, PageType>
} }
} }
void _createQuery() { void _createQuery(QueryClient client) {
query = QueryClient.of(context).createInfiniteQuery( query = client.createInfiniteQuery(
widget.queryKey, widget.queryKey,
widget.queryFn, widget.queryFn,
initialParam: widget.initialPage, initialParam: widget.initialPage,
@@ -98,7 +102,7 @@ class _InfiniteQueryBuilderState<DataType, ErrorType, PageType>
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) { WidgetsBinding.instance.addPostFrameCallback((_) {
initialize(); initialize(QueryClient.of(context));
}); });
} }
@@ -118,7 +122,7 @@ class _InfiniteQueryBuilderState<DataType, ErrorType, PageType>
dataSubscription?.cancel(); dataSubscription?.cancel();
errorSubscription?.cancel(); errorSubscription?.cancel();
removeListener?.call(); removeListener?.call();
initialize(); initialize(QueryClient.of(context));
return; return;
} else if (oldWidget.enabled != widget.enabled && widget.enabled) { } else if (oldWidget.enabled != widget.enabled && widget.enabled) {
query!.fetch(); query!.fetch();
@@ -144,7 +148,7 @@ class _InfiniteQueryBuilderState<DataType, ErrorType, PageType>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (query == null) { if (query == null) {
_createQuery(); _createQuery(QueryClient.of(context));
} }
return widget.builder(context, query!); return widget.builder(context, query!);
} }
@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/fl_query.dart'; import 'package:fl_query/fl_query.dart';
import 'package:fl_query/src/widgets/mixins/rebuilder.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fl_query/src/widgets/state_notifier_listenable.dart'; import 'package:fl_query/src/widgets/state_notifier_listenable.dart';
@@ -26,7 +27,8 @@ class InfiniteQueryListenable<DataType, ErrorType, PageType>
} }
class _InfiniteQueryListenableState<DataType, ErrorType, PageType> class _InfiniteQueryListenableState<DataType, ErrorType, PageType>
extends State<InfiniteQueryListenable<DataType, ErrorType, PageType>> { extends State<InfiniteQueryListenable<DataType, ErrorType, PageType>>
with SafeRebuild {
StreamSubscription<QueryCacheEvent>? _subscription; StreamSubscription<QueryCacheEvent>? _subscription;
@override @override
@@ -37,9 +39,8 @@ class _InfiniteQueryListenableState<DataType, ErrorType, PageType>
switch (event.type) { switch (event.type) {
case QueryCacheEventType.addInfiniteQuery: case QueryCacheEventType.addInfiniteQuery:
case QueryCacheEventType.removeInfiniteQuery: case QueryCacheEventType.removeInfiniteQuery:
if (mounted && if ((event.data as InfiniteQuery).key == widget.queryKey) {
(event.data as InfiniteQuery).key == widget.queryKey) { rebuild();
setState(() {});
} }
break; break;
default: default:
@@ -73,7 +73,7 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
RecoveryType? recoveryData; RecoveryType? recoveryData;
void subscribeOnMutate() { void subscribeOnMutate(QueryClient client) {
if (widget.onMutate != null) if (widget.onMutate != null)
mutationSubscription = mutation!.mutationStream.listen( mutationSubscription = mutation!.mutationStream.listen(
(event) async { (event) async {
@@ -81,7 +81,7 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
if (widget.onData != null) { if (widget.onData != null) {
dataSubscription?.cancel(); dataSubscription?.cancel();
subscribeOnData(); subscribeOnData(client);
} }
if (widget.onError != null) { if (widget.onError != null) {
@@ -92,7 +92,7 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
); );
} }
void subscribeOnData() { void subscribeOnData(QueryClient client) {
if (widget.onData != null || if (widget.onData != null ||
widget.refreshInfiniteQueries != null || widget.refreshInfiniteQueries != null ||
widget.refreshQueries != null) widget.refreshQueries != null)
@@ -100,11 +100,10 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
(event) { (event) {
final data = widget.onData?.call(event, recoveryData); final data = widget.onData?.call(event, recoveryData);
if (widget.refreshQueries != null && mounted) { if (widget.refreshQueries != null && mounted) {
QueryClient.of(context).refreshQueries(widget.refreshQueries!); client.refreshQueries(widget.refreshQueries!);
} }
if (widget.refreshInfiniteQueries != null && mounted) { if (widget.refreshInfiniteQueries != null && mounted) {
QueryClient.of(context) client.refreshInfiniteQueries(widget.refreshInfiniteQueries!);
.refreshInfiniteQueries(widget.refreshInfiniteQueries!);
} }
return data; return data;
}, },
@@ -120,18 +119,18 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
); );
} }
Future<void> initialize() async { Future<void> initialize(QueryClient client) async {
setState(() { setState(() {
_createMutation(); _createMutation(client);
subscribeOnMutate(); subscribeOnMutate(client);
subscribeOnData(); subscribeOnData(client);
subscribeOnError(); subscribeOnError();
removeListener = mutation!.addListener(rebuild); removeListener = mutation!.addListener(rebuild);
}); });
} }
void _createMutation() { void _createMutation(QueryClient client) {
mutation = QueryClient.of(context).createMutation( mutation = client.createMutation(
widget.mutationKey, widget.mutationKey,
widget.mutationFn, widget.mutationFn,
retryConfig: widget.retryConfig, retryConfig: widget.retryConfig,
@@ -142,7 +141,7 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
await initialize(); await initialize(QueryClient.of(context));
}); });
} }
@@ -161,12 +160,14 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
) { ) {
super.didUpdateWidget(oldWidget); super.didUpdateWidget(oldWidget);
final client = QueryClient.of(context);
if (oldWidget.mutationKey != widget.mutationKey) { if (oldWidget.mutationKey != widget.mutationKey) {
mutationSubscription?.cancel(); mutationSubscription?.cancel();
dataSubscription?.cancel(); dataSubscription?.cancel();
errorSubscription?.cancel(); errorSubscription?.cancel();
removeListener?.call(); removeListener?.call();
initialize(); initialize(client);
return; return;
} }
if (oldWidget.mutationFn != widget.mutationFn) { if (oldWidget.mutationFn != widget.mutationFn) {
@@ -174,15 +175,15 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
} }
if (oldWidget.onMutate != widget.onMutate) { if (oldWidget.onMutate != widget.onMutate) {
mutationSubscription?.cancel(); mutationSubscription?.cancel();
subscribeOnMutate(); subscribeOnMutate(client);
} }
if (oldWidget.onData != widget.onData || if (oldWidget.onData != widget.onData ||
oldWidget.refreshQueries != widget.refreshQueries || oldWidget.refreshQueries != widget.refreshQueries ||
oldWidget.refreshInfiniteQueries != widget.refreshInfiniteQueries) { oldWidget.refreshInfiniteQueries != widget.refreshInfiniteQueries) {
dataSubscription?.cancel(); dataSubscription?.cancel();
subscribeOnData(); subscribeOnData(client);
mutationSubscription?.cancel(); mutationSubscription?.cancel();
subscribeOnMutate(); subscribeOnMutate(client);
} }
if (oldWidget.onError != widget.onError) { if (oldWidget.onError != widget.onError) {
errorSubscription?.cancel(); errorSubscription?.cancel();
@@ -193,7 +194,7 @@ class _MutationBuilderState<DataType, ErrorType, VariablesType, RecoveryType>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (mutation == null) { if (mutation == null) {
_createMutation(); _createMutation(QueryClient.of(context));
} }
return widget.builder(context, mutation!); return widget.builder(context, mutation!);
} }
@@ -62,8 +62,8 @@ class _QueryBuilderState<DataType, ErrorType>
StreamSubscription<DataType>? dataSubscription; StreamSubscription<DataType>? dataSubscription;
StreamSubscription<ErrorType>? errorSubscription; StreamSubscription<ErrorType>? errorSubscription;
void _createQuery() { void _createQuery(QueryClient client) {
query = QueryClient.of(context).createQuery( query = client.createQuery(
widget.queryKey, widget.queryKey,
widget.queryFn, widget.queryFn,
initial: widget.initial, initial: widget.initial,
@@ -73,9 +73,9 @@ class _QueryBuilderState<DataType, ErrorType>
); );
} }
Future<void> initialize() async { Future<void> initialize(QueryClient client) async {
setState(() { setState(() {
_createQuery(); _createQuery(client);
if (widget.onData != null) if (widget.onData != null)
dataSubscription = query!.dataStream.listen(widget.onData); dataSubscription = query!.dataStream.listen(widget.onData);
if (widget.onData != null) if (widget.onData != null)
@@ -92,7 +92,7 @@ class _QueryBuilderState<DataType, ErrorType>
void initState() { void initState() {
super.initState(); super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) async { WidgetsBinding.instance.addPostFrameCallback((_) async {
await initialize(); await initialize(QueryClient.of(context));
}); });
} }
@@ -114,7 +114,7 @@ class _QueryBuilderState<DataType, ErrorType>
dataSubscription?.cancel(); dataSubscription?.cancel();
errorSubscription?.cancel(); errorSubscription?.cancel();
removeListener?.call(); removeListener?.call();
initialize(); initialize(QueryClient.of(context));
return; return;
} else if (oldWidget.enabled != widget.enabled && widget.enabled) { } else if (oldWidget.enabled != widget.enabled && widget.enabled) {
query!.fetch(); query!.fetch();
@@ -137,7 +137,7 @@ class _QueryBuilderState<DataType, ErrorType>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (query == null) { if (query == null) {
_createQuery(); _createQuery(QueryClient.of(context));
} }
return widget.builder(context, query!); return widget.builder(context, query!);
} }
@@ -1,6 +1,7 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/fl_query.dart'; import 'package:fl_query/fl_query.dart';
import 'package:fl_query/src/widgets/mixins/rebuilder.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:fl_query/src/widgets/state_notifier_listenable.dart'; import 'package:fl_query/src/widgets/state_notifier_listenable.dart';
@@ -24,7 +25,7 @@ class QueryListenable<DataType, ErrorType> extends StatefulWidget {
} }
class _QueryListenableState<DataType, ErrorType> class _QueryListenableState<DataType, ErrorType>
extends State<QueryListenable<DataType, ErrorType>> { extends State<QueryListenable<DataType, ErrorType>> with SafeRebuild {
StreamSubscription<QueryCacheEvent>? _subscription; StreamSubscription<QueryCacheEvent>? _subscription;
@override @override
@@ -35,8 +36,8 @@ class _QueryListenableState<DataType, ErrorType>
switch (event.type) { switch (event.type) {
case QueryCacheEventType.addQuery: case QueryCacheEventType.addQuery:
case QueryCacheEventType.removeQuery: case QueryCacheEventType.removeQuery:
if (mounted && (event.data as Query).key == widget.queryKey) { if ((event.data as Query).key == widget.queryKey) {
setState(() {}); rebuild();
} }
break; break;
default: default:
@@ -17,6 +17,7 @@ Mutation<DataType, ErrorType, VariablesType>
List<String>? refreshInfiniteQueries, List<String>? refreshInfiniteQueries,
List<Object?>? keys, List<Object?>? keys,
}) { }) {
final mounted = useIsMounted();
final rebuild = useUpdater(); final rebuild = useUpdater();
final client = useQueryClient(); final client = useQueryClient();
final mutation = final mutation =
@@ -42,7 +43,9 @@ Mutation<DataType, ErrorType, VariablesType>
useEffect(() { useEffect(() {
if (onMutate != null) { if (onMutate != null) {
return mutation.mutationStream.listen((event) async { return mutation.mutationStream.listen((event) async {
recoveryData.value = await onMutate.call(event); if (mounted()) {
recoveryData.value = await onMutate.call(event);
}
}).cancel; }).cancel;
} }
return null; return null;