refactor: more convenient ways customizing config

This commit is contained in:
Kingkor Roy Tirtho
2023-03-02 18:51:50 +06:00
parent 9e8959820f
commit 0c819d4e11
14 changed files with 159 additions and 53 deletions
@@ -1,6 +1,8 @@
import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
import 'package:flutter/material.dart';
@immutable
abstract class DefaultConstants { abstract class DefaultConstants {
static const RetryConfig retryConfig = RetryConfig( static const RetryConfig retryConfig = RetryConfig(
maxRetries: 3, maxRetries: 3,
@@ -1,3 +1,7 @@
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/core/client.dart';
import 'package:flutter/material.dart';
class RefreshConfig { class RefreshConfig {
final Duration staleDuration; final Duration staleDuration;
final Duration refreshInterval; final Duration refreshInterval;
@@ -10,4 +14,48 @@ class RefreshConfig {
required this.refreshOnMount, required this.refreshOnMount,
required this.refreshOnQueryFnChange, required this.refreshOnQueryFnChange,
}); });
factory RefreshConfig.withDefaults(
BuildContext context, {
Duration? staleDuration,
Duration? refreshInterval,
bool? refreshOnMount,
bool? refreshOnQueryFnChange,
}) {
return QueryClient.of(context).refreshConfig.copyWith(
staleDuration: staleDuration,
refreshInterval: refreshInterval,
refreshOnMount: refreshOnMount,
refreshOnQueryFnChange: refreshOnQueryFnChange,
);
}
factory RefreshConfig.withConstantDefaults({
Duration? staleDuration,
Duration? refreshInterval,
bool? refreshOnMount,
bool? refreshOnQueryFnChange,
}) {
return DefaultConstants.refreshConfig.copyWith(
staleDuration: staleDuration,
refreshInterval: refreshInterval,
refreshOnMount: refreshOnMount,
refreshOnQueryFnChange: refreshOnQueryFnChange,
);
}
RefreshConfig copyWith({
Duration? staleDuration,
Duration? refreshInterval,
bool? refreshOnMount,
bool? refreshOnQueryFnChange,
}) {
return RefreshConfig(
staleDuration: staleDuration ?? this.staleDuration,
refreshInterval: refreshInterval ?? this.refreshInterval,
refreshOnMount: refreshOnMount ?? this.refreshOnMount,
refreshOnQueryFnChange:
refreshOnQueryFnChange ?? this.refreshOnQueryFnChange,
);
}
} }
@@ -1,6 +1,41 @@
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/core/client.dart';
import 'package:flutter/material.dart';
class RetryConfig { class RetryConfig {
final int maxRetries; final int maxRetries;
final Duration retryDelay; final Duration retryDelay;
const RetryConfig({required this.maxRetries, required this.retryDelay}); const RetryConfig({required this.maxRetries, required this.retryDelay});
factory RetryConfig.withDefaults(
BuildContext context, {
int? maxRetries,
Duration? retryDelay,
}) {
return QueryClient.of(context).retryConfig.copyWith(
maxRetries: maxRetries,
retryDelay: retryDelay,
);
}
factory RetryConfig.withConstantDefaults({
int? maxRetries,
Duration? retryDelay,
}) {
return DefaultConstants.retryConfig.copyWith(
maxRetries: maxRetries,
retryDelay: retryDelay,
);
}
RetryConfig copyWith({
int? maxRetries,
Duration? retryDelay,
}) {
return RetryConfig(
maxRetries: maxRetries ?? this.maxRetries,
retryDelay: retryDelay ?? this.retryDelay,
);
}
} }
+6 -4
View File
@@ -1,11 +1,11 @@
import 'dart:async'; import 'dart:async';
import 'package:collection/collection.dart'; import 'package:collection/collection.dart';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/core/client.dart'; import 'package:fl_query/src/core/client.dart';
import 'package:fl_query/src/core/infinite_query.dart'; import 'package:fl_query/src/core/infinite_query.dart';
import 'package:fl_query/src/core/mutation.dart'; import 'package:fl_query/src/core/mutation.dart';
import 'package:fl_query/src/core/query.dart'; import 'package:fl_query/src/core/query.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart'; import 'package:hive_flutter/hive_flutter.dart';
enum QueryCacheEventType { enum QueryCacheEventType {
@@ -17,6 +17,7 @@ enum QueryCacheEventType {
removeMutation, removeMutation,
} }
@immutable
class QueryCacheEvent { class QueryCacheEvent {
final QueryCacheEventType type; final QueryCacheEventType type;
final Object data; final Object data;
@@ -31,13 +32,14 @@ class QueryCache {
final Duration cacheDuration; final Duration cacheDuration;
final _eventController = StreamController<QueryCacheEvent>.broadcast(); final StreamController<QueryCacheEvent> _eventController;
QueryCache({ QueryCache({
this.cacheDuration = DefaultConstants.cacheDuration, required this.cacheDuration,
}) : _queries = Set<Query>(), }) : _queries = Set<Query>(),
_infiniteQueries = Set<InfiniteQuery>(), _infiniteQueries = Set<InfiniteQuery>(),
_mutations = Set<Mutation>() { _mutations = Set<Mutation>(),
_eventController = StreamController<QueryCacheEvent>.broadcast() {
Timer.periodic(cacheDuration, (timer) { Timer.periodic(cacheDuration, (timer) {
_queries.removeWhere((query) { _queries.removeWhere((query) {
if (query.isInactive) { if (query.isInactive) {
+46 -20
View File
@@ -13,17 +13,41 @@ import 'package:fl_query/src/core/query.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:hive_flutter/adapters.dart'; import 'package:hive_flutter/adapters.dart';
@immutable
class QueryClient { class QueryClient {
final QueryCache cache; final QueryCache cache;
QueryClient({QueryCache? cache}) : this.cache = cache ?? QueryCache(); final RetryConfig retryConfig;
final RefreshConfig refreshConfig;
final Duration cacheDuration;
QueryClient({
QueryCache? cache,
this.cacheDuration = DefaultConstants.cacheDuration,
int? maxRetries,
Duration? retryDelay,
Duration? staleDuration,
Duration? refreshInterval,
bool? refreshOnMount,
bool? refreshOnQueryFnChange,
}) : this.cache = cache ?? QueryCache(cacheDuration: cacheDuration),
this.retryConfig = DefaultConstants.retryConfig.copyWith(
maxRetries: maxRetries,
retryDelay: retryDelay,
),
this.refreshConfig = DefaultConstants.refreshConfig.copyWith(
staleDuration: staleDuration,
refreshInterval: refreshInterval,
refreshOnMount: refreshOnMount,
refreshOnQueryFnChange: refreshOnQueryFnChange,
);
Query<DataType, ErrorType> createQuery<DataType, ErrorType>( Query<DataType, ErrorType> createQuery<DataType, ErrorType>(
String key, String key,
QueryFn<DataType> queryFn, { QueryFn<DataType> queryFn, {
DataType? initial, DataType? initial,
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig, RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig, JsonConfig<DataType>? jsonConfig,
}) { }) {
final query = cache.queries final query = cache.queries
@@ -33,8 +57,8 @@ class QueryClient {
key, key,
queryFn, queryFn,
initial: initial, initial: initial,
retryConfig: retryConfig, retryConfig: retryConfig ?? this.retryConfig,
refreshConfig: refreshConfig, refreshConfig: refreshConfig ?? this.refreshConfig,
jsonConfig: jsonConfig, jsonConfig: jsonConfig,
), ),
) )
@@ -48,8 +72,8 @@ class QueryClient {
String key, String key,
QueryFn<DataType> queryFn, { QueryFn<DataType> queryFn, {
DataType? initial, DataType? initial,
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig, RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig, JsonConfig<DataType>? jsonConfig,
}) async { }) async {
try { try {
@@ -114,8 +138,8 @@ class QueryClient {
InfiniteQueryFn<DataType, PageType> queryFn, { InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage, required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam, required PageType initialParam,
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig, RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig, JsonConfig<DataType>? jsonConfig,
}) { }) {
final query = cache.infiniteQueries final query = cache.infiniteQueries
@@ -126,8 +150,8 @@ class QueryClient {
queryFn, queryFn,
nextPage: nextPage, nextPage: nextPage,
initialParam: initialParam, initialParam: initialParam,
retryConfig: retryConfig, retryConfig: retryConfig ?? this.retryConfig,
refreshConfig: refreshConfig, refreshConfig: refreshConfig ?? this.refreshConfig,
jsonConfig: jsonConfig, jsonConfig: jsonConfig,
), ),
) )
@@ -139,12 +163,14 @@ class QueryClient {
} }
Future<DataType?> fetchInfiniteQuery<DataType, ErrorType, PageType>( Future<DataType?> fetchInfiniteQuery<DataType, ErrorType, PageType>(
String key, InfiniteQueryFn<DataType, PageType> queryFn, String key,
{required InfiniteQueryNextPage<DataType, PageType> nextPage, InfiniteQueryFn<DataType, PageType> queryFn, {
required PageType initialParam, required InfiniteQueryNextPage<DataType, PageType> nextPage,
RetryConfig retryConfig = DefaultConstants.retryConfig, required PageType initialParam,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig, RetryConfig? retryConfig,
JsonConfig<DataType>? jsonConfig}) async { RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
}) async {
try { try {
DataType? result; DataType? result;
final completer = Completer<DataType>(); final completer = Completer<DataType>();
@@ -224,7 +250,7 @@ class QueryClient {
createMutation<DataType, ErrorType, VariablesType>( createMutation<DataType, ErrorType, VariablesType>(
String key, String key,
MutationFn<DataType, VariablesType> mutationFn, { MutationFn<DataType, VariablesType> mutationFn, {
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
}) { }) {
final mutation = cache.mutations final mutation = cache.mutations
.firstWhere( .firstWhere(
@@ -232,7 +258,7 @@ class QueryClient {
orElse: () => Mutation<DataType, ErrorType, VariablesType>( orElse: () => Mutation<DataType, ErrorType, VariablesType>(
key, key,
mutationFn, mutationFn,
retryConfig: retryConfig, retryConfig: retryConfig ?? this.retryConfig,
), ),
) )
.cast<DataType, ErrorType, VariablesType>(); .cast<DataType, ErrorType, VariablesType>();
@@ -246,7 +272,7 @@ class QueryClient {
String key, String key,
VariablesType variables, { VariablesType variables, {
MutationFn<DataType, VariablesType>? mutationFn, MutationFn<DataType, VariablesType>? mutationFn,
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
List<String> refreshQueries = const [], List<String> refreshQueries = const [],
List<String> refreshInfiniteQueries = const [], List<String> refreshInfiniteQueries = const [],
}) async { }) async {
@@ -104,8 +104,8 @@ class InfiniteQuery<DataType, ErrorType, PageType>
InfiniteQueryFn<DataType, PageType> queryFn, { InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage, required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam, required PageType initialParam,
this.retryConfig = DefaultConstants.retryConfig, required this.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig, required this.refreshConfig,
this.jsonConfig, this.jsonConfig,
}) : _initialParam = initialParam, }) : _initialParam = initialParam,
_dataController = StreamController.broadcast(), _dataController = StreamController.broadcast(),
+3 -6
View File
@@ -1,7 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'package:async/async.dart'; import 'package:async/async.dart';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
import 'package:fl_query/src/core/mixins/retryer.dart'; import 'package:fl_query/src/core/mixins/retryer.dart';
import 'package:mutex/mutex.dart'; import 'package:mutex/mutex.dart';
@@ -44,11 +43,9 @@ class Mutation<DataType, ErrorType, VariablesType>
MutationFn<DataType, VariablesType> _mutationFn; MutationFn<DataType, VariablesType> _mutationFn;
Mutation( Mutation(this.key, MutationFn<DataType, VariablesType> mutationFn,
this.key, {required this.retryConfig})
MutationFn<DataType, VariablesType> mutationFn, { : _dataController = StreamController.broadcast(),
this.retryConfig = DefaultConstants.retryConfig,
}) : _dataController = StreamController.broadcast(),
_errorController = StreamController.broadcast(), _errorController = StreamController.broadcast(),
_mutationController = StreamController.broadcast(), _mutationController = StreamController.broadcast(),
_mutationFn = mutationFn, _mutationFn = mutationFn,
+2 -3
View File
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/json_config.dart';
import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
@@ -56,8 +55,8 @@ class Query<DataType, ErrorType>
this.key, this.key,
QueryFn<DataType> queryFn, { QueryFn<DataType> queryFn, {
DataType? initial, DataType? initial,
this.retryConfig = DefaultConstants.retryConfig, required this.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig, required this.refreshConfig,
this.jsonConfig, this.jsonConfig,
}) : _box = Hive.lazyBox(QueryClient.queryCachePrefix), }) : _box = Hive.lazyBox(QueryClient.queryCachePrefix),
_dataController = StreamController<DataType>.broadcast(), _dataController = StreamController<DataType>.broadcast(),
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/json_config.dart';
import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
@@ -23,8 +22,8 @@ class InfiniteQueryBuilder<DataType, ErrorType, PageType>
final PageType initialPage; final PageType initialPage;
final InfiniteQueryNextPage<DataType, PageType> nextPage; final InfiniteQueryNextPage<DataType, PageType> nextPage;
final RetryConfig retryConfig; final RetryConfig? retryConfig;
final RefreshConfig refreshConfig; final RefreshConfig? refreshConfig;
final JsonConfig<DataType>? jsonConfig; final JsonConfig<DataType>? jsonConfig;
final ValueChanged<PageEvent<DataType, PageType>>? onData; final ValueChanged<PageEvent<DataType, PageType>>? onData;
@@ -40,8 +39,8 @@ class InfiniteQueryBuilder<DataType, ErrorType, PageType>
required this.nextPage, required this.nextPage,
required this.builder, required this.builder,
required this.initialPage, required this.initialPage,
this.retryConfig = DefaultConstants.retryConfig, this.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig, this.refreshConfig,
this.jsonConfig, this.jsonConfig,
this.onData, this.onData,
this.onError, this.onError,
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
import 'package:fl_query/src/core/client.dart'; import 'package:fl_query/src/core/client.dart';
import 'package:fl_query/src/core/mutation.dart'; import 'package:fl_query/src/core/mutation.dart';
@@ -30,7 +29,7 @@ class MutationBuilder<DataType, ErrorType, VariablesType, RecoveryType>
final MutationFn<DataType, VariablesType> mutationFn; final MutationFn<DataType, VariablesType> mutationFn;
final String mutationKey; final String mutationKey;
final RetryConfig retryConfig; final RetryConfig? retryConfig;
final MutationOnDataFn<DataType, RecoveryType>? onData; final MutationOnDataFn<DataType, RecoveryType>? onData;
final MutationOnErrorFn<ErrorType, RecoveryType>? onError; final MutationOnErrorFn<ErrorType, RecoveryType>? onError;
@@ -45,7 +44,7 @@ class MutationBuilder<DataType, ErrorType, VariablesType, RecoveryType>
this.mutationKey, this.mutationKey,
this.mutationFn, { this.mutationFn, {
required this.builder, required this.builder,
this.retryConfig = DefaultConstants.retryConfig, this.retryConfig,
this.onData, this.onData,
this.onError, this.onError,
this.onMutate, this.onMutate,
@@ -1,6 +1,5 @@
import 'dart:async'; import 'dart:async';
import 'package:fl_query/src/collections/default_configs.dart';
import 'package:fl_query/src/collections/json_config.dart'; import 'package:fl_query/src/collections/json_config.dart';
import 'package:fl_query/src/collections/refresh_config.dart'; import 'package:fl_query/src/collections/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart'; import 'package:fl_query/src/collections/retry_config.dart';
@@ -21,8 +20,8 @@ class QueryBuilder<DataType, ErrorType> extends StatefulWidget {
final DataType? initial; final DataType? initial;
final RetryConfig retryConfig; final RetryConfig? retryConfig;
final RefreshConfig refreshConfig; final RefreshConfig? refreshConfig;
final JsonConfig<DataType>? jsonConfig; final JsonConfig<DataType>? jsonConfig;
final ValueChanged<DataType>? onData; final ValueChanged<DataType>? onData;
@@ -37,8 +36,8 @@ class QueryBuilder<DataType, ErrorType> extends StatefulWidget {
this.queryFn, { this.queryFn, {
required this.builder, required this.builder,
this.initial, this.initial,
this.retryConfig = DefaultConstants.retryConfig, this.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig, this.refreshConfig,
this.jsonConfig, this.jsonConfig,
this.onData, this.onData,
this.onError, this.onError,
@@ -12,8 +12,8 @@ InfiniteQuery<DataType, ErrorType, PageType>
InfiniteQueryFn<DataType, PageType> queryFn, { InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage, required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialPage, required PageType initialPage,
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig, RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig, JsonConfig<DataType>? jsonConfig,
ValueChanged<PageEvent<DataType, PageType>>? onData, ValueChanged<PageEvent<DataType, PageType>>? onData,
ValueChanged<PageEvent<ErrorType, PageType>>? onError, ValueChanged<PageEvent<ErrorType, PageType>>? onError,
@@ -9,7 +9,7 @@ Mutation<DataType, ErrorType, VariablesType>
useMutation<DataType, ErrorType, VariablesType, RecoveryType>( useMutation<DataType, ErrorType, VariablesType, RecoveryType>(
String mutationKey, String mutationKey,
MutationFn<DataType, VariablesType> mutationFn, { MutationFn<DataType, VariablesType> mutationFn, {
RetryConfig retryConfig = DefaultConstants.retryConfig, RetryConfig? retryConfig,
MutationOnDataFn<DataType, RecoveryType>? onData, MutationOnDataFn<DataType, RecoveryType>? onData,
MutationOnErrorFn<ErrorType, RecoveryType>? onError, MutationOnErrorFn<ErrorType, RecoveryType>? onError,
MutationOnMutationFn<VariablesType, RecoveryType>? onMutate, MutationOnMutationFn<VariablesType, RecoveryType>? onMutate,
@@ -10,8 +10,8 @@ Query<DataType, ErrorType> useQuery<DataType, ErrorType>(
final String queryKey, final String queryKey,
final QueryFn<DataType> queryFn, { final QueryFn<DataType> queryFn, {
final DataType? initial, final DataType? initial,
final RetryConfig retryConfig = DefaultConstants.retryConfig, final RetryConfig? retryConfig,
final RefreshConfig refreshConfig = DefaultConstants.refreshConfig, final RefreshConfig? refreshConfig,
final JsonConfig<DataType>? jsonConfig, final JsonConfig<DataType>? jsonConfig,
final ValueChanged<DataType>? onData, final ValueChanged<DataType>? onData,
final ValueChanged<ErrorType>? onError, final ValueChanged<ErrorType>? onError,