Skip to content

Instantly share code, notes, and snippets.

@jack24254029
Forked from nick45chen/dio_adapter.dart
Created August 4, 2021 02:48
Show Gist options
  • Save jack24254029/f5ef80ec6a0573bef70d7de9e94af7eb to your computer and use it in GitHub Desktop.
Save jack24254029/f5ef80ec6a0573bef70d7de9e94af7eb to your computer and use it in GitHub Desktop.
dio adapter
import 'package:dio/dio.dart';
import 'package:flutter_bili_app/http/core/hi_adapter.dart';
import 'package:flutter_bili_app/http/core/hi_error.dart';
import 'package:flutter_bili_app/http/request/base_request.dart';
/// Dio 適配器
class DioAdapter extends HiNetAdapter {
@override
Future<HiNetResponse<T>> send<T>(BaseRequest request) async {
var response, options = Options(headers: request.header);
var error;
try {
if (request.httpMethod() == HttpMethod.GET) {
response = await Dio().get(request.url(), options: options);
} else if (request.httpMethod() == HttpMethod.POST) {
response = await Dio().post(request.url(),
data: request.queryParameters, options: options);
} else if (request.httpMethod() == HttpMethod.DELETE) {
response = await Dio().post(request.url(),
data: request.queryParameters, options: options);
}
} on DioError catch (e) {
error = e;
response = e.response;
}
if (error != null) {
throw HiNetError(
code: response?.statusCode ?? -1,
message: error.toString(),
data: buildResponse(response, request),
);
}
return buildResponse(response, request);
}
/// 構建 HiNetResponse
HiNetResponse buildResponse(Response response, BaseRequest request) {
return HiNetResponse(
data: response.data,
request: request,
statusCode: response.statusCode,
statusMessage: response.statusMessage,
extra: response,
);
}
}
import 'package:flutter_bili_app/http/core/dio_adapter.dart';
import 'package:flutter_bili_app/http/core/hi_adapter.dart';
import 'package:flutter_bili_app/http/core/hi_error.dart';
import 'package:flutter_bili_app/http/request/base_request.dart';
import 'package:flutter_bili_app/utils/logger.dart';
class HiNet {
HiNet._();
static HiNet _instance;
static HiNet getInstance() {
if (_instance == null) {
_instance = HiNet._();
}
return _instance;
}
Future fire(BaseRequest request) async {
HiNetResponse response;
var error;
try {
response = await _send(request);
} on HiNetError catch (e) {
error = e;
response = e.data;
_printLog(e.message);
} catch (e) {
// 其他異常
error = e;
_printLog(e);
}
if (response == null) {
_printLog(error);
}
var result = response.data;
_printLog(result);
final statusCode = response.statusCode;
switch (statusCode) {
case 200:
return result;
case 401:
throw NeedLoginError();
case 403:
throw NeedAuthError(
result.toString(),
data: result,
);
default:
throw HiNetError(
code: statusCode,
message: result.toString(),
data: result,
);
}
}
Future<dynamic> _send<T>(BaseRequest request) async {
_printLog('url: ${request.url()}');
// 使用 mock 發送請求數據
//HiNetAdapter adapter = MockAdapter();
// 使用 dio 發送請求
HiNetAdapter adapter = DioAdapter();
return adapter.send(request);
}
void _printLog(dynamic message) {
Logger.printLog(message, tag: 'hi_net');
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment