networkRequest<T> method
Future<T?>
networkRequest<T>(
- Future<
T> request(- CancelToken cancelToken
- required dynamic onSuccess(
- T response
- bool showLoadingBar = true,
- bool showProgress = false,
- FutureOr<
void> handleError(- dynamic
- FutureOr<
void> handleErrorCode(- dynamic
- dynamic errorAction()?,
- CancelToken? cancelToken,
- dynamic handleErrorMessage(
- T response
Implementation
Future<T?> networkRequest<T>(
Future<T> Function(CancelToken cancelToken) request, {
required Function(T response) onSuccess,
bool showLoadingBar = true,
bool showProgress = false,
FutureOr<void> Function(dynamic)? handleError,
FutureOr<void> Function(dynamic)? handleErrorCode,
Function()? errorAction,
CancelToken? cancelToken,
Function(T response)? handleErrorMessage,
}) async {
// Create a cancel token if not provided
final token = cancelToken ?? createCancelToken();
if (showLoadingBar) {
loadingController.add(LoadingNonRenderState());
}
try {
// Call request with the cancel token
final response = await request(token);
// Remove token from list if request completed successfully
_cancelTokens.remove(token);
if (showLoadingBar) {
loadingController.add(EndLoadingNonRenderState());
}
// FBLogger.log("Response success: $response");
if (!isClosed) {
if (response is BaseModel) {
if (response.isSuccess) {
onSuccess(response);
return response;
} else {
if (handleErrorMessage != null) {
handleErrorMessage.call(response);
} else {
errorController.add(ErrorState(response.message!));
errorAction?.call();
}
return null; // Return null when request fails
}
} else {
onSuccess(response);
return response;
}
}
// Return response even if bloc is closed (for callers who need the value)
return response;
} catch (error) {
// Remove token from list when request completes (success or error)
_cancelTokens.remove(token);
if (showLoadingBar) {
loadingController.add(EndLoadingNonRenderState());
}
// Don't process errors if request was cancelled
if (error is DioException && error.type == DioExceptionType.cancel) {
// FBLogger.log("Request was cancelled");
// Return null for cancelled requests
return null;
}
// FBLogger.log("Error occurred: $error");
// Log non-fatal errors to Crashlytics for debugging
// await FBLogger.recordError(
// error,
// stackTrace,
// reason: 'Network request error',
// fatal: false,
// );
if (handleError != null) {
await handleError(error);
errorAction?.call();
return null; // Return null when error is handled
} else {
await handleResponse(
error,
(CancelToken ct) => request(ct),
showLoadingBar: showLoadingBar,
showProgress: showProgress,
onSuccess: onSuccess,
handleErrorCode: handleErrorCode,
);
if (errorAction != null) {
errorAction();
}
return null; // Return null after error handling
}
}
}