refactor: more convenient ways customizing config
This commit is contained in:
@@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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(),
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user