20 changed files with 573 additions and 331 deletions
@ -1,3 +1,3 @@
|
||||
{ |
||||
"cSpell.words": ["Getx", "tdesign"] |
||||
"cSpell.words": ["fenix", "Getx", "tdesign"] |
||||
} |
||||
|
@ -1,63 +1,15 @@
|
||||
import 'package:get/get.dart'; |
||||
import 'package:dio/dio.dart'; |
||||
import 'package:flutter/foundation.dart'; // 导入 debugPrint |
||||
import 'package:get_storage/get_storage.dart'; |
||||
import 'package:problem_check_system/data/providers/connectivity_provider.dart'; |
||||
import 'package:problem_check_system/data/providers/dio_provider.dart'; |
||||
import 'package:problem_check_system/data/providers/local_database.dart'; |
||||
|
||||
class InitialBinding implements Bindings { |
||||
@override |
||||
void dependencies() { |
||||
// 全局注册 GetStorage 实例 - 也改为使用 put 确保立即创建 |
||||
Get.put<GetStorage>(GetStorage(), permanent: true); |
||||
// 全局注册 Dio 实例 - 使用 put 而不是 lazyPut,并设置为永久 |
||||
Get.put<Dio>(createDioInstance()); |
||||
// |
||||
Get.put<LocalDatabase>(LocalDatabase()); |
||||
Get.put<ConnectivityProvider>(ConnectivityProvider()); |
||||
} |
||||
|
||||
// 提取创建 Dio 实例的逻辑到单独的方法 |
||||
Dio createDioInstance() { |
||||
final dio = Dio( |
||||
BaseOptions( |
||||
baseUrl: 'https://xhdev.anxincloud.cn', // 替换为你的服务器地址 |
||||
connectTimeout: const Duration(seconds: 15), |
||||
receiveTimeout: const Duration(seconds: 15), |
||||
), |
||||
); |
||||
|
||||
// 添加日志拦截器,仅在调试模式下打印日志 |
||||
if (kDebugMode) { |
||||
dio.interceptors.add( |
||||
LogInterceptor( |
||||
requestBody: true, |
||||
responseBody: true, |
||||
logPrint: (o) => debugPrint(o.toString()), |
||||
), |
||||
); |
||||
} |
||||
|
||||
// 添加认证拦截器 |
||||
dio.interceptors.add( |
||||
InterceptorsWrapper( |
||||
onRequest: (options, handler) { |
||||
final token = ""; //todo 获取token |
||||
if (token != null && token.isNotEmpty) { |
||||
options.headers['Authorization'] = 'Bearer $token'; |
||||
} |
||||
return handler.next(options); |
||||
}, |
||||
onError: (DioException e, handler) { |
||||
if (e.response?.statusCode == 401) { |
||||
// 如果收到 401 Unauthorized 错误,跳转回登录页 |
||||
Get.offAllNamed('/login'); |
||||
} |
||||
return handler.next(e); |
||||
}, |
||||
), |
||||
); |
||||
|
||||
return dio; |
||||
Get.put<DioProvider>(DioProvider(), permanent: true); |
||||
Get.put<LocalDatabase>(LocalDatabase(), permanent: true); |
||||
Get.put<ConnectivityProvider>(ConnectivityProvider(), permanent: true); |
||||
} |
||||
} |
||||
|
@ -0,0 +1,53 @@
|
||||
/// 登录请求模型 |
||||
class LoginRequest { |
||||
final String username; |
||||
final String password; |
||||
final String wechatJsCode; |
||||
|
||||
LoginRequest({ |
||||
required this.username, |
||||
required this.password, |
||||
this.wechatJsCode = "", |
||||
}); |
||||
|
||||
Map<String, dynamic> toJson() { |
||||
return { |
||||
'username': username, |
||||
'password': password, |
||||
'wechatJsCode': wechatJsCode, |
||||
}; |
||||
} |
||||
|
||||
// 从 Map 创建 LoginRequest 对象 |
||||
factory LoginRequest.fromJson(Map<String, dynamic> json) { |
||||
return LoginRequest( |
||||
username: json['username'] as String, |
||||
password: json['password'] as String, |
||||
wechatJsCode: json['wechatJsCode'] as String, |
||||
); |
||||
} |
||||
} |
||||
|
||||
/// 登录响应模型 |
||||
class LoginResponse { |
||||
final String token; |
||||
final String refreshToken; |
||||
final int expires; |
||||
final String name; |
||||
|
||||
LoginResponse({ |
||||
required this.token, |
||||
required this.refreshToken, |
||||
required this.expires, |
||||
required this.name, |
||||
}); |
||||
|
||||
factory LoginResponse.fromJson(Map<String, dynamic> json) { |
||||
return LoginResponse( |
||||
token: json['token'] ?? '', |
||||
refreshToken: json['refresh_token'] ?? '', |
||||
expires: json['expires'] ?? '', |
||||
name: json['name'] ?? '', |
||||
); |
||||
} |
||||
} |
@ -1,12 +0,0 @@
|
||||
class LoginModel { |
||||
final String username; |
||||
final String password; |
||||
|
||||
// 使用 const 构造函数,并要求所有字段在创建时必须被提供 |
||||
const LoginModel({required this.username, required this.password}); |
||||
|
||||
// (可选)提供一个 toMap 方法,方便将对象转换为 JSON 或 Map |
||||
Map<String, dynamic> toMap() { |
||||
return {'username': username, 'password': password}; |
||||
} |
||||
} |
@ -1,19 +0,0 @@
|
||||
import 'package:dio/dio.dart'; |
||||
import 'package:problem_check_system/data/models/login_model.dart'; |
||||
|
||||
class AuthProvider { |
||||
final String _signInUrl = '/api/Accounts/SignIn'; |
||||
|
||||
final Dio _dio; |
||||
|
||||
AuthProvider({required Dio dio}) : _dio = dio; |
||||
|
||||
Future<Response> signIn(LoginModel loginModel) async { |
||||
try { |
||||
final response = await _dio.post(_signInUrl, data: loginModel.toMap()); |
||||
return response; |
||||
} on DioException { |
||||
rethrow; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,265 @@
|
||||
import 'package:dio/dio.dart'; |
||||
import 'package:flutter/foundation.dart'; |
||||
import 'package:get/get.dart' hide Response; |
||||
import 'package:pretty_dio_logger/pretty_dio_logger.dart'; |
||||
import 'package:problem_check_system/data/repositories/auth_repository.dart'; |
||||
import 'package:problem_check_system/modules/auth/controllers/auth_controller.dart'; |
||||
|
||||
// DioProvider 是一个 GetxService,确保它在应用生命周期内是单例的。 |
||||
// 它负责初始化和配置 Dio 实例,并添加所有拦截器。 |
||||
class DioProvider extends GetxService { |
||||
static const String _baseUrl = 'https://xh.anxincloud.cn'; |
||||
|
||||
late final Dio _dio; |
||||
|
||||
@override |
||||
Future<void> onInit() async { |
||||
super.onInit(); |
||||
_initDio(); |
||||
} |
||||
|
||||
// 初始化 Dio 并配置基础选项。 |
||||
void _initDio() { |
||||
_dio = Dio( |
||||
BaseOptions( |
||||
baseUrl: _baseUrl, |
||||
connectTimeout: const Duration(seconds: 30), |
||||
receiveTimeout: const Duration(seconds: 30), |
||||
sendTimeout: const Duration(seconds: 30), |
||||
headers: { |
||||
'Content-Type': 'application/json', |
||||
'Accept': 'application/json', |
||||
}, |
||||
), |
||||
); |
||||
|
||||
// 添加拦截器。拦截器的顺序非常关键: |
||||
// 1. 认证拦截器 (AuthInterceptor): 负责添加 token 和处理 401 错误,优先级最高。 |
||||
// 2. 错误拦截器 (ErrorInterceptor): 处理通用错误,作为所有其他拦截器之后的最终捕获。 |
||||
// 3. 日志拦截器 (LoggerInterceptor): 在调试模式下打印详细日志,方便开发。 |
||||
_dio.interceptors.addAll(_getInterceptors()); |
||||
} |
||||
|
||||
List<Interceptor> _getInterceptors() { |
||||
return [ |
||||
_getAuthInterceptor(), |
||||
_getErrorInterceptor(), |
||||
if (kDebugMode) _getLoggerInterceptor(), |
||||
]; |
||||
} |
||||
|
||||
/// 认证拦截器:处理请求头中的 token 添加和 401 错误重试。 |
||||
Interceptor _getAuthInterceptor() { |
||||
return InterceptorsWrapper( |
||||
// 在请求发送前执行 |
||||
onRequest: (options, handler) async { |
||||
try { |
||||
// 尝试获取 AuthRepository 并添加 token 到请求头。 |
||||
final authRepository = Get.find<AuthRepository>(); |
||||
final token = authRepository.getToken(); |
||||
if (token != null && token.isNotEmpty) { |
||||
options.headers['Authorization'] = 'Bearer $token'; |
||||
} |
||||
} catch (e) { |
||||
// 如果 AuthRepository 尚未初始化(例如在登录或注册时),则跳过添加认证头。 |
||||
debugPrint('AuthRepository 未找到。跳过认证头。'); |
||||
} |
||||
return handler.next(options); |
||||
}, |
||||
// 在接收到错误时执行 |
||||
onError: (error, handler) async { |
||||
// 专门处理 401 Unauthorized 错误。 |
||||
if (error.response?.statusCode == 401) { |
||||
try { |
||||
final authRepository = Get.find<AuthRepository>(); |
||||
// 尝试刷新 token。 |
||||
await authRepository.refreshToken(); |
||||
|
||||
// 如果刷新成功,更新请求头并重试原始请求。 |
||||
final newOptions = Options( |
||||
method: error.requestOptions.method, |
||||
headers: error.requestOptions.headers |
||||
..['Authorization'] = 'Bearer ${authRepository.getToken()}', |
||||
); |
||||
|
||||
final response = await _dio.request( |
||||
error.requestOptions.path, |
||||
data: error.requestOptions.data, |
||||
queryParameters: error.requestOptions.queryParameters, |
||||
options: newOptions, |
||||
); |
||||
|
||||
// 使用 handler.resolve() 返回重试的结果,阻止错误继续传递。 |
||||
return handler.resolve(response); |
||||
} on Exception catch (e) { |
||||
debugPrint('刷新 token 失败: $e'); |
||||
// 如果刷新 token 失败,清除认证数据并跳转到登录页。 |
||||
try { |
||||
final authController = Get.find<AuthController>(); |
||||
await authController.logout(); |
||||
} catch (e) { |
||||
// 如果 AuthController 找不到,作为备用方案手动清除数据并导航。 |
||||
final authRepository = Get.find<AuthRepository>(); |
||||
authRepository.clearAuthData(); |
||||
if (Get.currentRoute != '/login') { |
||||
Get.offAllNamed('/login'); |
||||
} |
||||
} |
||||
// 传播原始错误,让下一个拦截器(通用错误拦截器)处理。 |
||||
return handler.next(error); |
||||
} |
||||
} |
||||
// 对于所有其他非 401 的错误,将错误传递给下一个拦截器。 |
||||
return handler.next(error); |
||||
}, |
||||
); |
||||
} |
||||
|
||||
/// 日志拦截器:在调试模式下打印详细的请求和响应日志。 |
||||
Interceptor _getLoggerInterceptor() { |
||||
return PrettyDioLogger( |
||||
requestHeader: true, |
||||
requestBody: true, |
||||
responseHeader: true, |
||||
responseBody: true, |
||||
error: true, |
||||
compact: false, |
||||
maxWidth: 90, |
||||
); |
||||
} |
||||
|
||||
/// 错误拦截器:处理通用的网络和服务器端错误,并显示 Snackbar 提示。 |
||||
Interceptor _getErrorInterceptor() { |
||||
return InterceptorsWrapper( |
||||
onError: (error, handler) { |
||||
// 处理网络连接超时或未知网络错误。 |
||||
if (error.type == DioExceptionType.connectionTimeout || |
||||
error.type == DioExceptionType.receiveTimeout || |
||||
error.type == DioExceptionType.sendTimeout) { |
||||
Get.snackbar('网络超时', '请检查网络连接后重试'); |
||||
} else if (error.type == DioExceptionType.unknown) { |
||||
Get.snackbar('网络异常', '请检查网络连接后重试'); |
||||
} |
||||
|
||||
// 这部分代码只会在 AuthInterceptor 没有处理的错误(即非 401)时执行。 |
||||
if (error.response != null) { |
||||
final message = _handleStatusCode(error.response!); |
||||
Get.snackbar('请求错误', message); |
||||
} |
||||
|
||||
return handler.next(error); |
||||
}, |
||||
); |
||||
} |
||||
|
||||
/// 辅助方法:根据 HTTP 状态码返回用户友好的错误信息。 |
||||
String _handleStatusCode(Response response) { |
||||
switch (response.statusCode) { |
||||
case 400: |
||||
return response.data?['detail'] ?? '请求参数错误'; |
||||
case 401: |
||||
return response.data?['detail'] ?? |
||||
'未授权,请重新登录'; // 注意:对于 401 错误,这行代码理想情况下不会被执行。 |
||||
case 403: |
||||
return response.data?['detail'] ?? '访问被拒绝'; |
||||
case 404: |
||||
return response.data?['detail'] ?? '请求资源不存在'; |
||||
case 422: |
||||
final errors = response.data?['errors']; |
||||
if (errors != null && errors is Map && errors.isNotEmpty) { |
||||
return errors.values.first?.first?.toString() ?? '数据验证失败'; |
||||
} |
||||
return response.data?['detail'] ?? '数据验证失败'; |
||||
case 500: |
||||
return response.data?['detail'] ?? '服务器内部错误'; |
||||
case 502: |
||||
return response.data?['detail'] ?? '网关错误'; |
||||
case 503: |
||||
return response.data?['detail'] ?? '服务不可用'; |
||||
default: |
||||
return response.data?['detail'] ?? '网络异常(${response.statusCode})'; |
||||
} |
||||
} |
||||
|
||||
void clear() { |
||||
_dio.interceptors.clear(); |
||||
} |
||||
|
||||
/// 新增的请求方法 |
||||
|
||||
/// 发送 GET 请求 |
||||
Future<Response> get( |
||||
String path, { |
||||
Map<String, dynamic>? queryParameters, |
||||
Options? options, |
||||
CancelToken? cancelToken, |
||||
ProgressCallback? onReceiveProgress, |
||||
}) async { |
||||
return await _dio.get( |
||||
path, |
||||
queryParameters: queryParameters, |
||||
options: options, |
||||
cancelToken: cancelToken, |
||||
onReceiveProgress: onReceiveProgress, |
||||
); |
||||
} |
||||
|
||||
/// 发送 POST 请求 |
||||
Future<Response> post( |
||||
String path, { |
||||
dynamic data, |
||||
Map<String, dynamic>? queryParameters, |
||||
Options? options, |
||||
CancelToken? cancelToken, |
||||
ProgressCallback? onSendProgress, |
||||
ProgressCallback? onReceiveProgress, |
||||
}) async { |
||||
return await _dio.post( |
||||
path, |
||||
data: data, |
||||
queryParameters: queryParameters, |
||||
options: options, |
||||
cancelToken: cancelToken, |
||||
onSendProgress: onSendProgress, |
||||
onReceiveProgress: onReceiveProgress, |
||||
); |
||||
} |
||||
|
||||
/// 发送 PUT 请求 |
||||
Future<Response> put( |
||||
String path, { |
||||
dynamic data, |
||||
Map<String, dynamic>? queryParameters, |
||||
Options? options, |
||||
CancelToken? cancelToken, |
||||
ProgressCallback? onSendProgress, |
||||
ProgressCallback? onReceiveProgress, |
||||
}) async { |
||||
return await _dio.put( |
||||
path, |
||||
data: data, |
||||
queryParameters: queryParameters, |
||||
options: options, |
||||
cancelToken: cancelToken, |
||||
onSendProgress: onSendProgress, |
||||
onReceiveProgress: onReceiveProgress, |
||||
); |
||||
} |
||||
|
||||
/// 发送 DELETE 请求 |
||||
Future<Response> delete( |
||||
String path, { |
||||
dynamic data, |
||||
Map<String, dynamic>? queryParameters, |
||||
Options? options, |
||||
CancelToken? cancelToken, |
||||
}) async { |
||||
return await _dio.delete( |
||||
path, |
||||
data: data, |
||||
queryParameters: queryParameters, |
||||
options: options, |
||||
cancelToken: cancelToken, |
||||
); |
||||
} |
||||
} |
@ -1,38 +0,0 @@
|
||||
import 'package:dio/dio.dart'; |
||||
|
||||
class UserProvider { |
||||
final Dio _dio; |
||||
|
||||
// 通过构造函数注入 Dio 实例 |
||||
UserProvider({required Dio dio}) : _dio = dio; |
||||
|
||||
/// 调用 API 修改用户密码 |
||||
/// |
||||
/// @param newPassword 新密码 |
||||
Future<Response> changePassword(String newPassword) async { |
||||
try { |
||||
final response = await _dio.post( |
||||
'/api/change_password', // 替换为你的修改密码接口地址 |
||||
data: { |
||||
'new_password': newPassword, |
||||
}, |
||||
); |
||||
return response; |
||||
} on DioException catch (e) { |
||||
// 抛出 DioException 以便在控制器中处理 |
||||
throw e; |
||||
} |
||||
} |
||||
|
||||
/// 调用 API 获取用户信息 |
||||
/// |
||||
/// 这个方法可以用于获取用户的姓名、手机号等信息 |
||||
Future<Response> getUserInfo() async { |
||||
try { |
||||
final response = await _dio.get('/api/user_info'); // 替换为你的用户信息接口地址 |
||||
return response; |
||||
} on DioException catch (e) { |
||||
throw e; |
||||
} |
||||
} |
||||
} |
@ -0,0 +1,138 @@
|
||||
import 'dart:developer'; |
||||
|
||||
import 'package:dio/dio.dart'; |
||||
import 'package:get/get.dart'; |
||||
import 'package:get_storage/get_storage.dart'; |
||||
import 'package:problem_check_system/data/models/auth_model.dart'; |
||||
import 'package:problem_check_system/data/providers/connectivity_provider.dart'; |
||||
import 'package:problem_check_system/data/providers/dio_provider.dart'; |
||||
|
||||
class AuthRepository extends GetxService { |
||||
final DioProvider dioProvider; |
||||
final GetStorage storage; |
||||
final ConnectivityProvider connectivityProvider; |
||||
|
||||
AuthRepository({ |
||||
required this.dioProvider, |
||||
required this.storage, |
||||
required this.connectivityProvider, |
||||
}); |
||||
|
||||
static const String _tokenKey = 'token'; |
||||
static const String _refreshTokenKey = 'refresh_token'; |
||||
static const String _loginKey = 'user'; |
||||
static const String _rememberPassword = 'remember_password'; |
||||
|
||||
void saveToken(String token) { |
||||
storage.write(_tokenKey, token); |
||||
} |
||||
|
||||
String? getToken() { |
||||
return storage.read(_tokenKey); |
||||
} |
||||
|
||||
void saveRefreshToken(String refreshToken) { |
||||
storage.write(_refreshTokenKey, refreshToken); |
||||
} |
||||
|
||||
String? getRefreshToken() { |
||||
return storage.read(_refreshTokenKey); |
||||
} |
||||
|
||||
void addLoginKey(LoginRequest login) { |
||||
storage.write(_loginKey, login.toJson()); |
||||
} |
||||
|
||||
/// 登录请求 |
||||
LoginRequest getLoginKey() { |
||||
final loginData = storage.read(_loginKey); |
||||
|
||||
// 检查是否找到数据,并进行反序列化 |
||||
if (loginData != null) { |
||||
// 确保类型正确,然后进行反序列化 |
||||
return LoginRequest.fromJson(Map<String, dynamic>.from(loginData)); |
||||
} |
||||
|
||||
// 如果没有找到数据,返回一个默认的空对象 |
||||
return LoginRequest(username: '', password: ''); |
||||
} |
||||
|
||||
void removeLoginKey() { |
||||
storage.remove(_loginKey); |
||||
} |
||||
|
||||
void addRememberPassword(bool remembered) { |
||||
storage.write(_rememberPassword, remembered); |
||||
} |
||||
|
||||
bool getRememberPassword() { |
||||
return storage.read(_rememberPassword); |
||||
} |
||||
|
||||
void clearAuthData() { |
||||
storage.remove(_tokenKey); |
||||
storage.remove(_refreshTokenKey); |
||||
} |
||||
|
||||
// 是否在线 |
||||
bool get isOnline { |
||||
return connectivityProvider.isOnline.value; |
||||
} |
||||
|
||||
/// Check if a user is currently logged in by verifying the existence of a token. |
||||
bool isLoggedIn() { |
||||
final token = getToken(); |
||||
return token != null && token.isNotEmpty; |
||||
} |
||||
|
||||
/// Handles the user login process by calling the API and saving the response. |
||||
Future<LoginResponse> login(LoginRequest request) async { |
||||
try { |
||||
final response = await dioProvider.post( |
||||
'/api/Accounts/SignIn', |
||||
data: request.toJson(), |
||||
); |
||||
|
||||
final loginResponse = LoginResponse.fromJson(response.data); |
||||
return loginResponse; |
||||
} catch (e) { |
||||
throw Exception(e); |
||||
} |
||||
} |
||||
|
||||
/// Refreshes the authentication token using the refresh token. |
||||
Future<LoginResponse> refreshToken() async { |
||||
final refreshToken = getRefreshToken(); |
||||
if (refreshToken == null || refreshToken.isEmpty) { |
||||
throw Exception('没有可用的刷新token'); |
||||
} |
||||
|
||||
try { |
||||
final response = await dioProvider.post( |
||||
'/auth/refresh', |
||||
data: {'refresh_token': refreshToken}, |
||||
); |
||||
|
||||
final authResponse = LoginResponse.fromJson(response.data); |
||||
saveToken(authResponse.token); |
||||
saveRefreshToken(authResponse.refreshToken); |
||||
|
||||
return authResponse; |
||||
} catch (e) { |
||||
throw Exception(e); |
||||
} |
||||
} |
||||
|
||||
/// Logs the user out by calling the API and then clearing local data. |
||||
Future<void> logout() async { |
||||
try { |
||||
// Attempt to call the API, but even if it fails, continue to clear local data. |
||||
await dioProvider.post('/auth/logout'); |
||||
} on DioException catch (e) { |
||||
log('退出登录API调用失败: ${e.message}'); |
||||
} finally { |
||||
// Regardless of API success or failure, always clear local storage. |
||||
clearAuthData(); |
||||
} |
||||
} |
||||
} |
@ -1,23 +1,33 @@
|
||||
import 'package:get/get.dart'; |
||||
import 'package:dio/dio.dart'; |
||||
import 'package:get_storage/get_storage.dart'; |
||||
import 'package:problem_check_system/data/providers/connectivity_provider.dart'; |
||||
import 'package:problem_check_system/data/providers/dio_provider.dart'; |
||||
import 'package:problem_check_system/data/repositories/auth_repository.dart'; |
||||
import 'package:problem_check_system/modules/auth/controllers/auth_controller.dart'; |
||||
import 'package:problem_check_system/data/providers/auth_provider.dart'; |
||||
|
||||
class AuthBinding implements Bindings { |
||||
@override |
||||
void dependencies() { |
||||
// 1. 注入数据提供者 (AuthProvider),它依赖于 Dio |
||||
// 依赖注入通过构造函数完成,使代码更易于测试 |
||||
Get.lazyPut<AuthProvider>(() => AuthProvider(dio: Get.find<Dio>())); |
||||
final DioProvider dioProvider = Get.find<DioProvider>(); |
||||
final GetStorage storage = Get.find<GetStorage>(); |
||||
final ConnectivityProvider connectivityProvider = |
||||
Get.find<ConnectivityProvider>(); |
||||
|
||||
Get.lazyPut<AuthRepository>( |
||||
() => AuthRepository( |
||||
dioProvider: dioProvider, |
||||
storage: storage, |
||||
connectivityProvider: connectivityProvider, |
||||
), |
||||
); |
||||
|
||||
// 2. 注入控制器 (AuthController),它依赖于 AuthProvider |
||||
// 控制器通过 Get.find() 获取已注入的依赖 |
||||
Get.lazyPut<AuthController>( |
||||
() => AuthController( |
||||
authProvider: Get.find<AuthProvider>(), |
||||
storage: Get.find<GetStorage>(), |
||||
), |
||||
() => AuthController(authRepository: Get.find<AuthRepository>()), |
||||
fenix: true, |
||||
); |
||||
} |
||||
} |
||||
|
@ -1,17 +1,20 @@
|
||||
import 'package:dio/dio.dart'; |
||||
import 'package:get/get.dart'; |
||||
import 'package:problem_check_system/data/repositories/auth_repository.dart'; |
||||
import 'package:problem_check_system/modules/my/controllers/change_password_controller.dart'; |
||||
import 'package:problem_check_system/data/providers/user_provider.dart'; // 假设你有这个 Provider |
||||
|
||||
class ChangePasswordBinding implements Bindings { |
||||
@override |
||||
void dependencies() { |
||||
// 如果 ChangePasswordController 依赖于 UserProvider,则需要先注入它 |
||||
final dio = Get.find<Dio>(); |
||||
Get.lazyPut<UserProvider>(() => UserProvider(dio: dio)); |
||||
Get.lazyPut<AuthRepository>( |
||||
() => AuthRepository( |
||||
dioProvider: Get.find(), |
||||
storage: Get.find(), |
||||
connectivityProvider: Get.find(), |
||||
), |
||||
); |
||||
Get.lazyPut<ChangePasswordController>( |
||||
// 如果需要,可以在这里注入依赖 |
||||
() => ChangePasswordController(userProvider: Get.find()), |
||||
() => ChangePasswordController(authRepository: Get.find()), |
||||
); |
||||
} |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue