From 7dd9036e69fbca225c6b764ea5a097cc8897fc5e Mon Sep 17 00:00:00 2001 From: Kingkor Roy Tirtho Date: Sat, 10 Jun 2023 12:12:49 +0600 Subject: [PATCH] chore: more comment and 1 level deep BuildContext --- .../fl_query/lib/src/core/infinite_query.dart | 2 + .../src/widgets/infinite_query_builder.dart | 20 ++++++---- .../widgets/infinite_query_listenable.dart | 9 +++-- .../lib/src/widgets/mutation_builder.dart | 37 ++++++++++--------- .../lib/src/widgets/query_builder.dart | 14 +++---- .../lib/src/widgets/query_listenable.dart | 7 ++-- .../fl_query_hooks/lib/src/use_mutation.dart | 5 ++- 7 files changed, 53 insertions(+), 41 deletions(-) diff --git a/packages/fl_query/lib/src/core/infinite_query.dart b/packages/fl_query/lib/src/core/infinite_query.dart index 93b40e0..9d71706 100644 --- a/packages/fl_query/lib/src/core/infinite_query.dart +++ b/packages/fl_query/lib/src/core/infinite_query.dart @@ -334,6 +334,8 @@ class InfiniteQuery /// /// This is internally used to update queryFn when external data /// has changed. Used by [InfiniteQueryBuilder] and [QueryClient] + /// + /// This can also refresh if [RefreshConfig.refreshOnQueryFnChange] is true void updateQueryFn(InfiniteQueryFn queryFn) { if (_queryFn == queryFn) return; _queryFn = queryFn; diff --git a/packages/fl_query/lib/src/widgets/infinite_query_builder.dart b/packages/fl_query/lib/src/widgets/infinite_query_builder.dart index 16d7dc1..517f5fa 100644 --- a/packages/fl_query/lib/src/widgets/infinite_query_builder.dart +++ b/packages/fl_query/lib/src/widgets/infinite_query_builder.dart @@ -29,7 +29,11 @@ class InfiniteQueryBuilder final ValueChanged>? onData; final ValueChanged>? 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 InfiniteQueryBuilderFn builder; @@ -66,9 +70,9 @@ class _InfiniteQueryBuilderState StreamSubscription>? dataSubscription; StreamSubscription>? errorSubscription; - Future initialize() async { + Future initialize(QueryClient client) async { setState(() { - _createQuery(); + _createQuery(client); if (widget.onData != null) dataSubscription = query!.dataStream.listen(widget.onData); @@ -82,8 +86,8 @@ class _InfiniteQueryBuilderState } } - void _createQuery() { - query = QueryClient.of(context).createInfiniteQuery( + void _createQuery(QueryClient client) { + query = client.createInfiniteQuery( widget.queryKey, widget.queryFn, initialParam: widget.initialPage, @@ -98,7 +102,7 @@ class _InfiniteQueryBuilderState void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { - initialize(); + initialize(QueryClient.of(context)); }); } @@ -118,7 +122,7 @@ class _InfiniteQueryBuilderState dataSubscription?.cancel(); errorSubscription?.cancel(); removeListener?.call(); - initialize(); + initialize(QueryClient.of(context)); return; } else if (oldWidget.enabled != widget.enabled && widget.enabled) { query!.fetch(); @@ -144,7 +148,7 @@ class _InfiniteQueryBuilderState @override Widget build(BuildContext context) { if (query == null) { - _createQuery(); + _createQuery(QueryClient.of(context)); } return widget.builder(context, query!); } diff --git a/packages/fl_query/lib/src/widgets/infinite_query_listenable.dart b/packages/fl_query/lib/src/widgets/infinite_query_listenable.dart index 8a55692..d8c1c37 100644 --- a/packages/fl_query/lib/src/widgets/infinite_query_listenable.dart +++ b/packages/fl_query/lib/src/widgets/infinite_query_listenable.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:fl_query/fl_query.dart'; +import 'package:fl_query/src/widgets/mixins/rebuilder.dart'; import 'package:flutter/material.dart'; import 'package:fl_query/src/widgets/state_notifier_listenable.dart'; @@ -26,7 +27,8 @@ class InfiniteQueryListenable } class _InfiniteQueryListenableState - extends State> { + extends State> + with SafeRebuild { StreamSubscription? _subscription; @override @@ -37,9 +39,8 @@ class _InfiniteQueryListenableState switch (event.type) { case QueryCacheEventType.addInfiniteQuery: case QueryCacheEventType.removeInfiniteQuery: - if (mounted && - (event.data as InfiniteQuery).key == widget.queryKey) { - setState(() {}); + if ((event.data as InfiniteQuery).key == widget.queryKey) { + rebuild(); } break; default: diff --git a/packages/fl_query/lib/src/widgets/mutation_builder.dart b/packages/fl_query/lib/src/widgets/mutation_builder.dart index b5c751f..11481ee 100644 --- a/packages/fl_query/lib/src/widgets/mutation_builder.dart +++ b/packages/fl_query/lib/src/widgets/mutation_builder.dart @@ -73,7 +73,7 @@ class _MutationBuilderState RecoveryType? recoveryData; - void subscribeOnMutate() { + void subscribeOnMutate(QueryClient client) { if (widget.onMutate != null) mutationSubscription = mutation!.mutationStream.listen( (event) async { @@ -81,7 +81,7 @@ class _MutationBuilderState if (widget.onData != null) { dataSubscription?.cancel(); - subscribeOnData(); + subscribeOnData(client); } if (widget.onError != null) { @@ -92,7 +92,7 @@ class _MutationBuilderState ); } - void subscribeOnData() { + void subscribeOnData(QueryClient client) { if (widget.onData != null || widget.refreshInfiniteQueries != null || widget.refreshQueries != null) @@ -100,11 +100,10 @@ class _MutationBuilderState (event) { final data = widget.onData?.call(event, recoveryData); if (widget.refreshQueries != null && mounted) { - QueryClient.of(context).refreshQueries(widget.refreshQueries!); + client.refreshQueries(widget.refreshQueries!); } if (widget.refreshInfiniteQueries != null && mounted) { - QueryClient.of(context) - .refreshInfiniteQueries(widget.refreshInfiniteQueries!); + client.refreshInfiniteQueries(widget.refreshInfiniteQueries!); } return data; }, @@ -120,18 +119,18 @@ class _MutationBuilderState ); } - Future initialize() async { + Future initialize(QueryClient client) async { setState(() { - _createMutation(); - subscribeOnMutate(); - subscribeOnData(); + _createMutation(client); + subscribeOnMutate(client); + subscribeOnData(client); subscribeOnError(); removeListener = mutation!.addListener(rebuild); }); } - void _createMutation() { - mutation = QueryClient.of(context).createMutation( + void _createMutation(QueryClient client) { + mutation = client.createMutation( widget.mutationKey, widget.mutationFn, retryConfig: widget.retryConfig, @@ -142,7 +141,7 @@ class _MutationBuilderState void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { - await initialize(); + await initialize(QueryClient.of(context)); }); } @@ -161,12 +160,14 @@ class _MutationBuilderState ) { super.didUpdateWidget(oldWidget); + final client = QueryClient.of(context); + if (oldWidget.mutationKey != widget.mutationKey) { mutationSubscription?.cancel(); dataSubscription?.cancel(); errorSubscription?.cancel(); removeListener?.call(); - initialize(); + initialize(client); return; } if (oldWidget.mutationFn != widget.mutationFn) { @@ -174,15 +175,15 @@ class _MutationBuilderState } if (oldWidget.onMutate != widget.onMutate) { mutationSubscription?.cancel(); - subscribeOnMutate(); + subscribeOnMutate(client); } if (oldWidget.onData != widget.onData || oldWidget.refreshQueries != widget.refreshQueries || oldWidget.refreshInfiniteQueries != widget.refreshInfiniteQueries) { dataSubscription?.cancel(); - subscribeOnData(); + subscribeOnData(client); mutationSubscription?.cancel(); - subscribeOnMutate(); + subscribeOnMutate(client); } if (oldWidget.onError != widget.onError) { errorSubscription?.cancel(); @@ -193,7 +194,7 @@ class _MutationBuilderState @override Widget build(BuildContext context) { if (mutation == null) { - _createMutation(); + _createMutation(QueryClient.of(context)); } return widget.builder(context, mutation!); } diff --git a/packages/fl_query/lib/src/widgets/query_builder.dart b/packages/fl_query/lib/src/widgets/query_builder.dart index ff34a75..0616990 100644 --- a/packages/fl_query/lib/src/widgets/query_builder.dart +++ b/packages/fl_query/lib/src/widgets/query_builder.dart @@ -62,8 +62,8 @@ class _QueryBuilderState StreamSubscription? dataSubscription; StreamSubscription? errorSubscription; - void _createQuery() { - query = QueryClient.of(context).createQuery( + void _createQuery(QueryClient client) { + query = client.createQuery( widget.queryKey, widget.queryFn, initial: widget.initial, @@ -73,9 +73,9 @@ class _QueryBuilderState ); } - Future initialize() async { + Future initialize(QueryClient client) async { setState(() { - _createQuery(); + _createQuery(client); if (widget.onData != null) dataSubscription = query!.dataStream.listen(widget.onData); if (widget.onData != null) @@ -92,7 +92,7 @@ class _QueryBuilderState void initState() { super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) async { - await initialize(); + await initialize(QueryClient.of(context)); }); } @@ -114,7 +114,7 @@ class _QueryBuilderState dataSubscription?.cancel(); errorSubscription?.cancel(); removeListener?.call(); - initialize(); + initialize(QueryClient.of(context)); return; } else if (oldWidget.enabled != widget.enabled && widget.enabled) { query!.fetch(); @@ -137,7 +137,7 @@ class _QueryBuilderState @override Widget build(BuildContext context) { if (query == null) { - _createQuery(); + _createQuery(QueryClient.of(context)); } return widget.builder(context, query!); } diff --git a/packages/fl_query/lib/src/widgets/query_listenable.dart b/packages/fl_query/lib/src/widgets/query_listenable.dart index 1170197..f8fdaeb 100644 --- a/packages/fl_query/lib/src/widgets/query_listenable.dart +++ b/packages/fl_query/lib/src/widgets/query_listenable.dart @@ -1,6 +1,7 @@ import 'dart:async'; import 'package:fl_query/fl_query.dart'; +import 'package:fl_query/src/widgets/mixins/rebuilder.dart'; import 'package:flutter/material.dart'; import 'package:fl_query/src/widgets/state_notifier_listenable.dart'; @@ -24,7 +25,7 @@ class QueryListenable extends StatefulWidget { } class _QueryListenableState - extends State> { + extends State> with SafeRebuild { StreamSubscription? _subscription; @override @@ -35,8 +36,8 @@ class _QueryListenableState switch (event.type) { case QueryCacheEventType.addQuery: case QueryCacheEventType.removeQuery: - if (mounted && (event.data as Query).key == widget.queryKey) { - setState(() {}); + if ((event.data as Query).key == widget.queryKey) { + rebuild(); } break; default: diff --git a/packages/fl_query_hooks/lib/src/use_mutation.dart b/packages/fl_query_hooks/lib/src/use_mutation.dart index d1f6eb3..d5341bb 100644 --- a/packages/fl_query_hooks/lib/src/use_mutation.dart +++ b/packages/fl_query_hooks/lib/src/use_mutation.dart @@ -17,6 +17,7 @@ Mutation List? refreshInfiniteQueries, List? keys, }) { + final mounted = useIsMounted(); final rebuild = useUpdater(); final client = useQueryClient(); final mutation = @@ -42,7 +43,9 @@ Mutation useEffect(() { if (onMutate != null) { return mutation.mutationStream.listen((event) async { - recoveryData.value = await onMutate.call(event); + if (mounted()) { + recoveryData.value = await onMutate.call(event); + } }).cancel; } return null;