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/retry_config.dart';
import 'package:flutter/material.dart';
@immutable
abstract class DefaultConstants {
static const RetryConfig retryConfig = RetryConfig(
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 {
final Duration staleDuration;
final Duration refreshInterval;
@@ -10,4 +14,48 @@ class RefreshConfig {
required this.refreshOnMount,
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 {
final int maxRetries;
final Duration 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 '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/infinite_query.dart';
import 'package:fl_query/src/core/mutation.dart';
import 'package:fl_query/src/core/query.dart';
import 'package:flutter/material.dart';
import 'package:hive_flutter/hive_flutter.dart';
enum QueryCacheEventType {
@@ -17,6 +17,7 @@ enum QueryCacheEventType {
removeMutation,
}
@immutable
class QueryCacheEvent {
final QueryCacheEventType type;
final Object data;
@@ -31,13 +32,14 @@ class QueryCache {
final Duration cacheDuration;
final _eventController = StreamController<QueryCacheEvent>.broadcast();
final StreamController<QueryCacheEvent> _eventController;
QueryCache({
this.cacheDuration = DefaultConstants.cacheDuration,
required this.cacheDuration,
}) : _queries = Set<Query>(),
_infiniteQueries = Set<InfiniteQuery>(),
_mutations = Set<Mutation>() {
_mutations = Set<Mutation>(),
_eventController = StreamController<QueryCacheEvent>.broadcast() {
Timer.periodic(cacheDuration, (timer) {
_queries.removeWhere((query) {
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:hive_flutter/adapters.dart';
@immutable
class QueryClient {
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>(
String key,
QueryFn<DataType> queryFn, {
DataType? initial,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
RetryConfig? retryConfig,
RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
}) {
final query = cache.queries
@@ -33,8 +57,8 @@ class QueryClient {
key,
queryFn,
initial: initial,
retryConfig: retryConfig,
refreshConfig: refreshConfig,
retryConfig: retryConfig ?? this.retryConfig,
refreshConfig: refreshConfig ?? this.refreshConfig,
jsonConfig: jsonConfig,
),
)
@@ -48,8 +72,8 @@ class QueryClient {
String key,
QueryFn<DataType> queryFn, {
DataType? initial,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
RetryConfig? retryConfig,
RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
}) async {
try {
@@ -114,8 +138,8 @@ class QueryClient {
InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
RetryConfig? retryConfig,
RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
}) {
final query = cache.infiniteQueries
@@ -126,8 +150,8 @@ class QueryClient {
queryFn,
nextPage: nextPage,
initialParam: initialParam,
retryConfig: retryConfig,
refreshConfig: refreshConfig,
retryConfig: retryConfig ?? this.retryConfig,
refreshConfig: refreshConfig ?? this.refreshConfig,
jsonConfig: jsonConfig,
),
)
@@ -139,12 +163,14 @@ class QueryClient {
}
Future<DataType?> fetchInfiniteQuery<DataType, ErrorType, PageType>(
String key, InfiniteQueryFn<DataType, PageType> queryFn,
{required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
JsonConfig<DataType>? jsonConfig}) async {
String key,
InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam,
RetryConfig? retryConfig,
RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
}) async {
try {
DataType? result;
final completer = Completer<DataType>();
@@ -224,7 +250,7 @@ class QueryClient {
createMutation<DataType, ErrorType, VariablesType>(
String key,
MutationFn<DataType, VariablesType> mutationFn, {
RetryConfig retryConfig = DefaultConstants.retryConfig,
RetryConfig? retryConfig,
}) {
final mutation = cache.mutations
.firstWhere(
@@ -232,7 +258,7 @@ class QueryClient {
orElse: () => Mutation<DataType, ErrorType, VariablesType>(
key,
mutationFn,
retryConfig: retryConfig,
retryConfig: retryConfig ?? this.retryConfig,
),
)
.cast<DataType, ErrorType, VariablesType>();
@@ -246,7 +272,7 @@ class QueryClient {
String key,
VariablesType variables, {
MutationFn<DataType, VariablesType>? mutationFn,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RetryConfig? retryConfig,
List<String> refreshQueries = const [],
List<String> refreshInfiniteQueries = const [],
}) async {
@@ -104,8 +104,8 @@ class InfiniteQuery<DataType, ErrorType, PageType>
InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialParam,
this.retryConfig = DefaultConstants.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig,
required this.retryConfig,
required this.refreshConfig,
this.jsonConfig,
}) : _initialParam = initialParam,
_dataController = StreamController.broadcast(),
+3 -6
View File
@@ -1,7 +1,6 @@
import 'dart:async';
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/core/mixins/retryer.dart';
import 'package:mutex/mutex.dart';
@@ -44,11 +43,9 @@ class Mutation<DataType, ErrorType, VariablesType>
MutationFn<DataType, VariablesType> _mutationFn;
Mutation(
this.key,
MutationFn<DataType, VariablesType> mutationFn, {
this.retryConfig = DefaultConstants.retryConfig,
}) : _dataController = StreamController.broadcast(),
Mutation(this.key, MutationFn<DataType, VariablesType> mutationFn,
{required this.retryConfig})
: _dataController = StreamController.broadcast(),
_errorController = StreamController.broadcast(),
_mutationController = StreamController.broadcast(),
_mutationFn = mutationFn,
+2 -3
View File
@@ -1,6 +1,5 @@
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/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart';
@@ -56,8 +55,8 @@ class Query<DataType, ErrorType>
this.key,
QueryFn<DataType> queryFn, {
DataType? initial,
this.retryConfig = DefaultConstants.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig,
required this.retryConfig,
required this.refreshConfig,
this.jsonConfig,
}) : _box = Hive.lazyBox(QueryClient.queryCachePrefix),
_dataController = StreamController<DataType>.broadcast(),
@@ -1,6 +1,5 @@
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/refresh_config.dart';
import 'package:fl_query/src/collections/retry_config.dart';
@@ -23,8 +22,8 @@ class InfiniteQueryBuilder<DataType, ErrorType, PageType>
final PageType initialPage;
final InfiniteQueryNextPage<DataType, PageType> nextPage;
final RetryConfig retryConfig;
final RefreshConfig refreshConfig;
final RetryConfig? retryConfig;
final RefreshConfig? refreshConfig;
final JsonConfig<DataType>? jsonConfig;
final ValueChanged<PageEvent<DataType, PageType>>? onData;
@@ -40,8 +39,8 @@ class InfiniteQueryBuilder<DataType, ErrorType, PageType>
required this.nextPage,
required this.builder,
required this.initialPage,
this.retryConfig = DefaultConstants.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig,
this.retryConfig,
this.refreshConfig,
this.jsonConfig,
this.onData,
this.onError,
@@ -1,6 +1,5 @@
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/core/client.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 String mutationKey;
final RetryConfig retryConfig;
final RetryConfig? retryConfig;
final MutationOnDataFn<DataType, RecoveryType>? onData;
final MutationOnErrorFn<ErrorType, RecoveryType>? onError;
@@ -45,7 +44,7 @@ class MutationBuilder<DataType, ErrorType, VariablesType, RecoveryType>
this.mutationKey,
this.mutationFn, {
required this.builder,
this.retryConfig = DefaultConstants.retryConfig,
this.retryConfig,
this.onData,
this.onError,
this.onMutate,
@@ -1,6 +1,5 @@
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/refresh_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 RetryConfig retryConfig;
final RefreshConfig refreshConfig;
final RetryConfig? retryConfig;
final RefreshConfig? refreshConfig;
final JsonConfig<DataType>? jsonConfig;
final ValueChanged<DataType>? onData;
@@ -37,8 +36,8 @@ class QueryBuilder<DataType, ErrorType> extends StatefulWidget {
this.queryFn, {
required this.builder,
this.initial,
this.retryConfig = DefaultConstants.retryConfig,
this.refreshConfig = DefaultConstants.refreshConfig,
this.retryConfig,
this.refreshConfig,
this.jsonConfig,
this.onData,
this.onError,
@@ -12,8 +12,8 @@ InfiniteQuery<DataType, ErrorType, PageType>
InfiniteQueryFn<DataType, PageType> queryFn, {
required InfiniteQueryNextPage<DataType, PageType> nextPage,
required PageType initialPage,
RetryConfig retryConfig = DefaultConstants.retryConfig,
RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
RetryConfig? retryConfig,
RefreshConfig? refreshConfig,
JsonConfig<DataType>? jsonConfig,
ValueChanged<PageEvent<DataType, PageType>>? onData,
ValueChanged<PageEvent<ErrorType, PageType>>? onError,
@@ -9,7 +9,7 @@ Mutation<DataType, ErrorType, VariablesType>
useMutation<DataType, ErrorType, VariablesType, RecoveryType>(
String mutationKey,
MutationFn<DataType, VariablesType> mutationFn, {
RetryConfig retryConfig = DefaultConstants.retryConfig,
RetryConfig? retryConfig,
MutationOnDataFn<DataType, RecoveryType>? onData,
MutationOnErrorFn<ErrorType, RecoveryType>? onError,
MutationOnMutationFn<VariablesType, RecoveryType>? onMutate,
@@ -10,8 +10,8 @@ Query<DataType, ErrorType> useQuery<DataType, ErrorType>(
final String queryKey,
final QueryFn<DataType> queryFn, {
final DataType? initial,
final RetryConfig retryConfig = DefaultConstants.retryConfig,
final RefreshConfig refreshConfig = DefaultConstants.refreshConfig,
final RetryConfig? retryConfig,
final RefreshConfig? refreshConfig,
final JsonConfig<DataType>? jsonConfig,
final ValueChanged<DataType>? onData,
final ValueChanged<ErrorType>? onError,