You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
183 lines
4.6 KiB
183 lines
4.6 KiB
import 'package:flutter/foundation.dart';
|
|
import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
|
|
|
|
import 'api_service.dart';
|
|
import 'home_api.dart';
|
|
import 'network_config.dart';
|
|
import 'user_api.dart';
|
|
|
|
/// 网络请求服务管理器
|
|
class NetworkService {
|
|
static final NetworkService _instance = NetworkService._internal();
|
|
|
|
// API服务实例
|
|
late final ApiService _apiService; // 主API服务
|
|
late final UserApi _userApi;
|
|
late final HomeApi _homeApi;
|
|
|
|
/// 获取单例实例
|
|
factory NetworkService() {
|
|
return _instance;
|
|
}
|
|
|
|
NetworkService._internal() {
|
|
// 初始化API服务 - 使用主API
|
|
final dio = NetworkConfig.createDio();
|
|
_apiService = ApiService(dio);
|
|
_userApi = UserApi(dio);
|
|
_homeApi = HomeApi(dio);
|
|
}
|
|
|
|
/// 通用GET请求
|
|
Future<dynamic> get(
|
|
String path,
|
|
{Map<String, dynamic>? queryParameters,
|
|
bool showLoading = false,
|
|
bool showError = true,
|
|
ApiType apiType = ApiType.main}) async {
|
|
try {
|
|
if (showLoading) {
|
|
_showLoading();
|
|
}
|
|
|
|
// 如果有queryParameters,将其附加到path
|
|
String finalPath = path;
|
|
if (queryParameters != null && queryParameters.isNotEmpty) {
|
|
final queryString = queryParameters.entries
|
|
.map((e) => '${e.key}=${e.value}')
|
|
.join('&');
|
|
finalPath = '$path?$queryString';
|
|
}
|
|
|
|
// 根据API类型选择对应的服务
|
|
final apiService = _getApiServiceByType(apiType);
|
|
final response = await apiService.get(finalPath);
|
|
|
|
return response.data;
|
|
} catch (e) {
|
|
if (showError) {
|
|
_handleError(e);
|
|
}
|
|
return null;
|
|
} finally {
|
|
if (showLoading) {
|
|
_hideLoading();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 通用POST请求
|
|
Future<dynamic> post(
|
|
String path,
|
|
dynamic data,
|
|
{bool showLoading = false,
|
|
bool showError = true,
|
|
ApiType apiType = ApiType.main}) async {
|
|
try {
|
|
if (showLoading) {
|
|
_showLoading();
|
|
}
|
|
|
|
// 根据API类型选择对应的服务
|
|
final apiService = _getApiServiceByType(apiType);
|
|
final response = await apiService.post(
|
|
path,
|
|
data,
|
|
);
|
|
|
|
return response.data;
|
|
} catch (e) {
|
|
if (showError) {
|
|
_handleError(e);
|
|
}
|
|
return null;
|
|
} finally {
|
|
if (showLoading) {
|
|
_hideLoading();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 通用PUT请求(通过POST模拟)
|
|
Future<dynamic> put(
|
|
String path,
|
|
dynamic data,
|
|
{bool showLoading = false,
|
|
bool showError = true,
|
|
ApiType apiType = ApiType.main}) async {
|
|
// 注意:这是一个简化实现,实际项目中应该使用真实的PUT方法
|
|
try {
|
|
if (showLoading) {
|
|
_showLoading();
|
|
}
|
|
|
|
// 在实际项目中,应该使用支持PUT方法的API服务
|
|
// 这里使用POST作为替代
|
|
final apiService = _getApiServiceByType(apiType);
|
|
final response = await apiService.post(
|
|
path,
|
|
data,
|
|
);
|
|
|
|
return response.data;
|
|
} catch (e) {
|
|
if (showError) {
|
|
_handleError(e);
|
|
}
|
|
return null;
|
|
} finally {
|
|
if (showLoading) {
|
|
_hideLoading();
|
|
}
|
|
}
|
|
}
|
|
|
|
/// 通用DELETE请求(通过GET模拟)
|
|
Future<dynamic> delete(
|
|
String path,
|
|
{bool showLoading = false,
|
|
bool showError = true,
|
|
ApiType apiType = ApiType.main}) async {
|
|
// 注意:这是一个简化实现,实际项目中应该使用真实的DELETE方法
|
|
return get(path, showLoading: showLoading, showError: showError, apiType: apiType);
|
|
}
|
|
|
|
/// 通用PATCH请求(通过POST模拟)
|
|
Future<dynamic> patch(
|
|
String path,
|
|
dynamic data,
|
|
{bool showLoading = false,
|
|
bool showError = true,
|
|
ApiType apiType = ApiType.main}) async {
|
|
// 注意:这是一个简化实现,实际项目中应该使用真实的PATCH方法
|
|
return post(path, data, showLoading: showLoading, showError: showError, apiType: apiType);
|
|
}
|
|
|
|
/// 获取API服务实例
|
|
ApiService _getApiServiceByType(ApiType type) {
|
|
// 无论类型是什么,都返回主API服务
|
|
return _apiService;
|
|
}
|
|
|
|
/// 用户相关API
|
|
UserApi get userApi => _userApi;
|
|
|
|
/// 首页相关API
|
|
HomeApi get homeApi => _homeApi;
|
|
|
|
void _showLoading() {
|
|
// 使用FlutterSmartDialog显示加载指示器
|
|
SmartDialog.showLoading();
|
|
}
|
|
|
|
void _hideLoading() {
|
|
// 隐藏加载指示器
|
|
SmartDialog.dismiss();
|
|
}
|
|
|
|
void _handleError(dynamic error) {
|
|
// 统一错误处理逻辑
|
|
debugPrint('网络错误: $error');
|
|
// 这里可以根据不同的错误类型进行处理
|
|
}
|
|
}
|