grockResponseHandler<T> method

Future<T?> grockResponseHandler<T>({
  1. T success(
    1. Response response
    )?,
  2. void error(
    1. dynamic err
    )?,
  3. void loading()?,
  4. void done()?,
})

----------------- grockResponseHandler example -----------------

final response = await GrockDioServices.request().grockResponseHandler(
 success: (response) => Model.fromJson(response.data),
 error: (err) => Toast.show(err.toString()),
 loading: () => print("loading"),
 done: () => print("done"),
);

Implementation

Future<T?> grockResponseHandler<T>(
    {T Function(Response response)? success,
    void Function(dynamic err)? error,
    void Function()? loading,
    void Function()? done}) async {
  try {
    loading?.call();
    final response = await this;
    if (response.statusCode == 200) {
      done?.call();
      return success?.call(response);
    } else {
      done?.call();
      throw DioException(
        requestOptions: response.requestOptions,
        type: DioExceptionType.badResponse,
        response: response,
        error: response.data,
        message: response.statusMessage,
        stackTrace: StackTrace.current,
      );
    }
  } on DioException catch (e) {
    log("Error: ${e.error}, Response: ${e.response}, Message: ${e.message}, StackTrace: ${e.stackTrace}, RequestOptions: ${e.requestOptions}, Type: ${e.type}",
        name: "DioException Error");
    if (e.response?.data != null) {
      error?.call(e.response?.data);
      throw Exception(e.response?.data);
    } else {
      error?.call(e.error);
      throw Exception(e.response?.statusMessage);
    }
  } catch (e) {
    log("Error: $e", name: "Catch Error");
    error?.call(e);
    throw Exception(e);
  }
}