fix(query): isLoading & isRefreshing not working as expected
This commit is contained in:
@@ -29,13 +29,15 @@ class QueryPage extends StatelessWidget {
|
||||
'hello',
|
||||
() {
|
||||
return Future.delayed(
|
||||
const Duration(seconds: 6), () => 'Hello World! $value');
|
||||
const Duration(seconds: 6),
|
||||
() => 'Hello World! $value',
|
||||
);
|
||||
},
|
||||
initial: 'Hello',
|
||||
jsonConfig: JsonConfig(
|
||||
fromJson: (json) => json['data'],
|
||||
toJson: (data) => {'data': data},
|
||||
),
|
||||
// jsonConfig: JsonConfig(
|
||||
// fromJson: (json) => json['data'],
|
||||
// toJson: (data) => {'data': data},
|
||||
// ),
|
||||
onData: (value) {
|
||||
debugPrint('onData: $value');
|
||||
},
|
||||
|
||||
@@ -21,23 +21,28 @@ class QueryState<DataType, ErrorType> with Invalidation {
|
||||
final DateTime updatedAt;
|
||||
final Duration staleDuration;
|
||||
|
||||
final bool _loading;
|
||||
|
||||
const QueryState({
|
||||
this.data,
|
||||
this.error,
|
||||
required this.updatedAt,
|
||||
required this.staleDuration,
|
||||
});
|
||||
bool loading = false,
|
||||
}) : _loading = loading;
|
||||
|
||||
QueryState<DataType, ErrorType> copyWith({
|
||||
DataType? data,
|
||||
ErrorType? error,
|
||||
DateTime? updatedAt,
|
||||
bool? loading,
|
||||
}) {
|
||||
return QueryState<DataType, ErrorType>(
|
||||
updatedAt: updatedAt ?? this.updatedAt,
|
||||
staleDuration: staleDuration,
|
||||
data: data ?? this.data,
|
||||
error: error ?? this.error,
|
||||
loading: loading ?? this._loading,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -125,9 +130,11 @@ class Query<DataType, ErrorType>
|
||||
StreamSubscription<bool>? _connectivitySubscription;
|
||||
|
||||
bool get isInitial => hasData && state.data == _initial;
|
||||
bool get isLoading => isInitial ? _mutex.isLocked : !hasData && !hasError;
|
||||
bool get isLoading =>
|
||||
(isInitial && !hasError && state._loading) ||
|
||||
(!hasData && !hasError && state._loading);
|
||||
bool get isRefreshing =>
|
||||
((!isInitial && hasData) || hasError) && _mutex.isLocked;
|
||||
((!isInitial && hasData) || hasError) && state._loading;
|
||||
bool get isInactive => !hasListeners;
|
||||
bool get hasData => state.data != null;
|
||||
bool get hasError => state.error != null;
|
||||
@@ -145,7 +152,7 @@ class Query<DataType, ErrorType>
|
||||
return;
|
||||
}
|
||||
return _mutex.protect(() async {
|
||||
state = state.copyWith();
|
||||
state = state.copyWith(loading: true);
|
||||
_operation = cancellableRetryOperation(
|
||||
_queryFn,
|
||||
config: retryConfig,
|
||||
@@ -154,6 +161,7 @@ class Query<DataType, ErrorType>
|
||||
data: data,
|
||||
error: null,
|
||||
updatedAt: DateTime.now(),
|
||||
loading: false,
|
||||
);
|
||||
if (data is DataType) {
|
||||
_dataController.add(data);
|
||||
@@ -166,7 +174,11 @@ class Query<DataType, ErrorType>
|
||||
}
|
||||
},
|
||||
onFailed: (ErrorType? error) {
|
||||
state = state.copyWith(error: error, updatedAt: DateTime.now());
|
||||
state = state.copyWith(
|
||||
error: error,
|
||||
updatedAt: DateTime.now(),
|
||||
loading: false,
|
||||
);
|
||||
if (error is ErrorType) _errorController.add(error);
|
||||
},
|
||||
);
|
||||
@@ -193,12 +205,20 @@ class Query<DataType, ErrorType>
|
||||
}
|
||||
|
||||
void setData(DataType data) {
|
||||
state = state.copyWith(data: data, updatedAt: DateTime.now());
|
||||
state = state.copyWith(
|
||||
data: data,
|
||||
updatedAt: DateTime.now(),
|
||||
loading: false,
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> reset() async {
|
||||
await _operation?.cancel();
|
||||
state = state.copyWith(data: _initial, updatedAt: DateTime.now());
|
||||
state = state.copyWith(
|
||||
data: _initial,
|
||||
updatedAt: DateTime.now(),
|
||||
loading: false,
|
||||
);
|
||||
_box.delete(key);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user