278 lines
14 KiB
Dart
278 lines
14 KiB
Dart
import 'package:dio/dio.dart';
|
||
import 'package:get_it/get_it.dart';
|
||
import 'package:go_router/go_router.dart';
|
||
import 'package:maibu_satabot_v2/core/infrastructure/logging/sentry_logger_impl.dart';
|
||
import 'package:maibu_satabot_v2/core/logging/i_logger_service.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/data/datasources/impl/device_http_datasource_impl.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/data/datasources/impl/path_http_datasource_impl.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/domain/repositories/device_repository.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/domain/usecases/get_user_device_usecase.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/domain/usecases/select_work_record_usecase.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/domain/usecases/unbind_device_usecase.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/domain/usecases/update_devicename_usecase.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/presentation/bloc/devices_cubit.dart';
|
||
import 'package:maibu_satabot_v2/features/devices/services/path_planning_service.dart';
|
||
import 'package:maibu_satabot_v2/features/my/presentation/bloc/my_cubit.dart';
|
||
import 'package:maibu_satabot_v2/features/my/repository/my_repository.dart';
|
||
import 'package:maibu_satabot_v2/features/my/repository/my_repository_impl.dart';
|
||
import 'package:maibu_satabot_v2/features/my/usecases/updatename_usecase.dart';
|
||
import 'package:maibu_satabot_v2/features/main_container/presentation/cubit/tab_config_cubit.dart';
|
||
import 'package:maibu_satabot_v2/features/remote_control/data/repositories/remote_control_repository_impl.dart';
|
||
import 'package:maibu_satabot_v2/features/remote_control/domain/repositories/remote_control_repository.dart';
|
||
import 'package:maibu_satabot_v2/features/remote_control/domain/usecase/diff_steer_usecase.dart';
|
||
import 'package:shared_preferences/shared_preferences.dart';
|
||
|
||
import '../../features/auth/data/datasources/auth_http_datasource.dart';
|
||
import '../../features/auth/data/datasources/auth_tcp_datasource.dart';
|
||
import '../../features/auth/data/datasources/impl/auth_http_datasource_impl.dart';
|
||
import '../../features/auth/data/datasources/impl/auth_tcp_datasource_impl.dart';
|
||
import '../../features/auth/data/repositories/auth_repository_impl.dart';
|
||
import '../../features/auth/domain/repositories/auth_repository.dart';
|
||
import '../../features/auth/domain/usecases/login_usecase.dart';
|
||
import '../../features/auth/presentation/bloc/auth_cubit.dart';
|
||
import '../../features/auth/presentation/bloc/login_bloc.dart';
|
||
import '../../features/auth/presentation/bloc/login_cubit.dart';
|
||
import '../../features/devices/data/datasources/device_http_datasource.dart';
|
||
import '../../features/devices/data/datasources/path_http_datasource.dart';
|
||
import '../../features/devices/data/repositories/device_hostriry_work_impl.dart';
|
||
import '../../features/devices/data/repositories/device_repository_impl.dart';
|
||
import '../../features/devices/data/repositories/generate_path_repository_Impl.dart';
|
||
import '../../features/devices/data/repositories/route_planning_repository_impl.dart';
|
||
import '../../features/devices/domain/repositories/device_hostrity_work_repository.dart';
|
||
import '../../features/devices/domain/repositories/path_repository.dart';
|
||
import '../../features/devices/domain/repositories/route_planning_repository.dart';
|
||
import '../../features/devices/domain/usecases/bind_device_usecase.dart';
|
||
import '../../features/devices/domain/usecases/delete_work_record_usecase.dart';
|
||
import '../../features/devices/domain/usecases/device_work_hostrirty_usecase.dart';
|
||
import '../../features/devices/domain/usecases/generate_path_usecase.dart';
|
||
import '../../features/devices/domain/usecases/get_device_location_usecase.dart';
|
||
import '../../features/devices/domain/usecases/get_work_record_usecase.dart';
|
||
import '../../features/devices/domain/usecases/route_planning_usecase.dart';
|
||
import '../../features/devices/domain/usecases/save_work_record_usecase.dart';
|
||
import '../../features/devices/domain/usecases/select_work_record_usecase.dart';
|
||
import '../../features/devices/domain/usecases/switch_device_usecase.dart';
|
||
import '../../features/devices/presentation/bloc/device_status_bloc.dart';
|
||
import '../../features/remote_control/data/datasources/remote_http_datasource.dart';
|
||
import '../../features/remote_control/data/datasources/remote_tcp_datasource.dart';
|
||
import '../../features/remote_control/domain/usecase/remote_control_usecase.dart';
|
||
import '../../features/remote_control/presentation/bloc/remote_control_cubit.dart';
|
||
import '../../features/v2/home/data/datasources/home_remote_datasource.dart';
|
||
import '../../features/v2/home/data/repositories/home_repository_impl.dart';
|
||
import '../../features/v2/home/domain/repositories/home_repository.dart';
|
||
import '../../features/v2/home/domain/usecases/get_home_data_usecase.dart';
|
||
import '../../features/v2/home/presentation/bloc/home_v2_bloc.dart';
|
||
import '../../features/v2/device_list/data/datasources/device_remote_datasource.dart' as device_v2;
|
||
import '../../features/v2/device_list/data/repositories/device_repository_impl.dart' as device_v2_repo;
|
||
import '../../features/v2/device_list/domain/repositories/device_repository.dart' as device_v2_domain;
|
||
import '../../features/v2/device_list/domain/usecases/get_device_status_data_usecase.dart' as device_v2_usecase;
|
||
import '../../features/v2/device_list/presentation/bloc/device_status_bloc.dart' as device_v2_bloc;
|
||
import '../../features/v2/waring_center/data/datasources/alarm_remote_datasource.dart';
|
||
import '../../features/v2/waring_center/data/datasources/impl/alarm_remote_datasource_impl.dart';
|
||
import '../../features/v2/waring_center/data/repositories/alarm_repository_impl.dart';
|
||
import '../../features/v2/waring_center/domain/repositories/alarm_repository.dart';
|
||
import '../../features/v2/waring_center/domain/usecases/get_alarm_count_usecase.dart';
|
||
import '../../features/v2/waring_center/domain/usecases/get_alarm_list_usecase.dart';
|
||
import '../../features/v2/waring_center/presentation/bloc/alarm_cubit.dart';
|
||
import '../app/app_user_cubit.dart';
|
||
import '../localization/locale_cubit.dart';
|
||
import '../../features/home/presentation/bloc/permission_request_bloc.dart';
|
||
import '../network/dio_client.dart';
|
||
import '../network/net_message_dispatcher.dart';
|
||
import '../network/tcp/tcp_client.dart';
|
||
import '../router/app_router.dart';
|
||
import '../storage/impl/user_storage_impl.dart';
|
||
import '../storage/user_storage.dart';
|
||
|
||
final sl = GetIt.instance;
|
||
|
||
Future<void> init() async {
|
||
/// 1. 底层工具与存储 (最底层)
|
||
/// 1.1 --- Network ---
|
||
/// 1.1.1 Dio:Http客户端
|
||
sl.registerLazySingleton<Dio>(() => DioClient.create());
|
||
|
||
/// 1.1.2 TcpClient:TCP客户端
|
||
sl.registerLazySingleton(
|
||
() => TcpClient(sl<UserStorage>(), getUserDeviceUseCase: sl<GetUserDeviceUseCase>(), switchDeviceUseCase: sl<SwitchDeviceUseCase>()),
|
||
);
|
||
sl.registerLazySingleton(() => PathPlanningService());
|
||
|
||
/// 1.1.3 NetMessageDispatcher:消息调度器,并将 TcpClient 注入给它
|
||
sl.registerLazySingleton(() => NetMessageDispatcher(
|
||
sl<TcpClient>(),
|
||
sl<RoutePlanningRepository>(),
|
||
sl<PathPlanningService>(),
|
||
getAppState: () => sl<DevicesCubit>().state.appState,
|
||
));
|
||
|
||
/// 1.2 --- 本地存储 (LocalStorage) ---
|
||
/// 1.2.1 SharedPreferences:本地存储库
|
||
final sharedPrefs = await SharedPreferences.getInstance();
|
||
sl.registerLazySingleton<SharedPreferences>(() => sharedPrefs);
|
||
|
||
/// 1.2.2 UserStorage:用户存储库
|
||
sl.registerLazySingleton<UserStorage>(
|
||
// 必须先注册上面本地存储库的实例
|
||
() => UserStorageImpl(sl<SharedPreferences>()),
|
||
);
|
||
|
||
/// 1.3 Log工具Sentry
|
||
sl.registerLazySingleton<ILoggerService>(() => SentryLoggerImpl());
|
||
|
||
/// 2. 数据源 (DataSource)
|
||
sl.registerLazySingleton<AuthHttpDataSource>(() => AuthHttpDataSourceImpl(sl()));
|
||
sl.registerLazySingleton<DeviceHttpDatasource>(
|
||
() => DeviceHttpDatasourceImpl(sl(), sl<UserStorage>()), //
|
||
);
|
||
sl.registerLazySingleton<RemoteHttpDatasource>(
|
||
() => RemoteHttpDatasource(sl(), sl<UserStorage>()),
|
||
);
|
||
|
||
sl.registerLazySingleton<RemoteTcpDatasource>(
|
||
() => RemoteTcpDatasource(sl<TcpClient>(), sl<UserStorage>()),
|
||
);
|
||
|
||
/// 3. 仓库 (Repository)
|
||
sl.registerLazySingleton<AuthRepository>(
|
||
() => AuthRepositoryImpl(
|
||
httpRemote: sl(), // 自动寻找已注册的 LoginRemoteDataSource
|
||
localTokenStorage: sl(), // 自动寻找已注册的 TokenStorage
|
||
),
|
||
);
|
||
|
||
// 1. 注册 UpdateNameUsecase
|
||
sl.registerLazySingleton<UpdateNameUsecase>(
|
||
() => UpdateNameUsecase(sl<MyRepository>()), // 注入 MyRepository 实例
|
||
);
|
||
sl.registerLazySingleton<MyRepository>(
|
||
() => MyRepositoryImpl(
|
||
userStorage: sl<UserStorage>(), // 注入 UserStorage
|
||
),
|
||
);
|
||
|
||
// 2. 注册 MyCubit
|
||
sl.registerLazySingleton<MyCubit>(
|
||
() => MyCubit(
|
||
sl<MyRepository>(), // 注入仓库
|
||
sl<UpdateNameUsecase>(), // 注入 UseCase
|
||
),
|
||
);
|
||
|
||
sl.registerLazySingleton<RoutePlanningRepository>(
|
||
() => RoutePlanningRepositoryImpl(tcp: sl<TcpClient>()), //
|
||
);
|
||
|
||
sl.registerLazySingleton<RoutePlanningUseCase>(
|
||
() => RoutePlanningUseCase(sl<RoutePlanningRepository>()), //
|
||
);
|
||
|
||
//工作历史
|
||
sl.registerLazySingleton<DeviceHostrityWorkRepositoryRepository>(
|
||
() => DeviceHostrityWorkRepositoryImpl(
|
||
client: sl<Dio>(), // 使用 Dio 实例
|
||
userStorage: sl<UserStorage>(),
|
||
),
|
||
);
|
||
|
||
sl.registerLazySingleton<DeviceRepository>(() => DeviceRepositoryImpl(sl()));
|
||
sl.registerLazySingleton<RemoteControlRepository>(() => RemoteControlRepositoryImpl(sl(), sl() ,sl(),sl()));
|
||
|
||
/// 4. 用例 (UseCase)
|
||
sl.registerLazySingleton(() => LoginUseCase(sl()));
|
||
sl.registerLazySingleton(() => GetUserDeviceUseCase(sl()));
|
||
sl.registerLazySingleton(() => DiffSteerUseCase());
|
||
sl.registerLazySingleton(() => DeviceWorkHostrirty(sl()));
|
||
sl.registerLazySingleton<SelectWorkRecordUseCase>(() => SelectWorkRecordUseCase(sl<PathRepository>()));
|
||
sl.registerLazySingleton(() => UnbindDeviceUseCase(sl()));
|
||
sl.registerLazySingleton(() => BindDeviceUseCase(sl()));
|
||
sl.registerLazySingleton(() => UpdateDevicenameUsecase(sl()));
|
||
sl.registerLazySingleton<SaveWorkRecordUseCase>(() => SaveWorkRecordUseCase(sl<PathRepository>()));
|
||
sl.registerLazySingleton<SwitchDeviceUseCase>(() => SwitchDeviceUseCase(sl()));
|
||
|
||
sl.registerLazySingleton<AuthTcpDatasource>(
|
||
() => AuthTcpDatasourceImpl(
|
||
sl<TcpClient>(),
|
||
sl<UserStorage>(),
|
||
getUserDeviceUseCase: sl<GetUserDeviceUseCase>(),
|
||
switchDeviceUseCase: sl<SwitchDeviceUseCase>(),
|
||
),
|
||
);
|
||
|
||
sl.registerLazySingleton<RequestControlPermissionUseCase>(() => RequestControlPermissionUseCase(sl()));
|
||
|
||
/// Home V2
|
||
sl.registerLazySingleton<HomeRemoteDataSource>(() => HomeRemoteDataSourceImpl());
|
||
sl.registerLazySingleton<HomeRepository>(() => HomeRepositoryImpl(sl()));
|
||
sl.registerLazySingleton<GetHomeDataUseCase>(() => GetHomeDataUseCase(sl()));
|
||
sl.registerFactory<HomeV2Bloc>(() => HomeV2Bloc(sl()));
|
||
|
||
/// Device Status V2
|
||
sl.registerLazySingleton<device_v2.DeviceRemoteDataSource>(() => device_v2.DeviceRemoteDataSourceImpl());
|
||
sl.registerLazySingleton<device_v2_domain.DeviceRepository>(() => device_v2_repo.DeviceRepositoryImpl(remoteDataSource: sl()));
|
||
sl.registerLazySingleton<device_v2_usecase.GetDeviceStatusDataUseCase>(() => device_v2_usecase.GetDeviceStatusDataUseCase(repository: sl()));
|
||
sl.registerFactory<device_v2_bloc.DeviceStatusBloc>(() => device_v2_bloc.DeviceStatusBloc(sl()));
|
||
|
||
/// Alarm Center V2
|
||
sl.registerLazySingleton<AlarmRemoteDataSource>(() => AlarmRemoteDataSourceImpl());
|
||
sl.registerLazySingleton<AlarmRepository>(() => AlarmRepositoryImpl(sl()));
|
||
sl.registerLazySingleton<GetAlarmListUseCase>(() => GetAlarmListUseCase(sl()));
|
||
sl.registerLazySingleton<GetAlarmCountUseCase>(() => GetAlarmCountUseCase(sl()));
|
||
sl.registerFactory<AlarmCubit>(() => AlarmCubit(
|
||
getAlarmListUseCase: sl(),
|
||
getAlarmCountUseCase: sl(),
|
||
));
|
||
|
||
|
||
/// 5. 状态管理 (Cubit/Bloc)
|
||
sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册
|
||
|
||
// 🔥 语言管理 Cubit (单例)
|
||
sl.registerLazySingleton(() => LocaleCubit());
|
||
|
||
// Tab 配置 Cubit (单例)
|
||
sl.registerLazySingleton(() => TabConfigCubit(sl<SharedPreferences>()));
|
||
|
||
sl.registerLazySingleton(() => GetDeviceLocationUseCase(sl()));
|
||
sl.registerLazySingleton(() => DevicesCubit(sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(), sl(),sl(),sl(),sl()));
|
||
|
||
// 🔥 DeviceStatusBloc 必须在 RemoteControlCubit 之前注册(单例)
|
||
sl.registerLazySingleton(() => DeviceStatusBloc(
|
||
sl<NetMessageDispatcher>(),
|
||
client: sl<TcpClient>(), // 🔥 传入 TcpClient
|
||
));
|
||
|
||
// 🔥 RemoteControlCubit 注入 DeviceStatusBloc(工厂模式,每次新建)
|
||
sl.registerFactory(() => RemoteControlCubit(sl(), sl(), sl(), sl()));
|
||
|
||
// 🔥 PermissionRequestBloc 用于首页权限弹窗(单例,通过 NetMessageDispatcher 监听)
|
||
sl.registerLazySingleton(() => PermissionRequestBloc(
|
||
sl<NetMessageDispatcher>(),
|
||
sl<RemoteControlRepository>(),
|
||
));
|
||
|
||
/// . 路径生成
|
||
sl.registerLazySingleton<PathHttpDatasource>(
|
||
() => PathHttpDatasourceImpl(
|
||
// 需先注册 http.Client(见下方)
|
||
sl<UserStorage>(),
|
||
),
|
||
);
|
||
sl.registerLazySingleton<PathRepository>(() => PathRepositoryImpl(datasource: sl<PathHttpDatasource>()));
|
||
sl.registerLazySingleton<GeneratePathUseCase>(() => GeneratePathUseCaseImpl(sl<PathRepository>()));
|
||
|
||
///.路径获取和删除
|
||
sl.registerLazySingleton(() => GetWorkRecordUseCase(sl<PathRepository>()));
|
||
sl.registerLazySingleton(() => DeleteWorkRecordUseCase(sl<PathRepository>()));
|
||
|
||
/// 6. 认证 (Auth)
|
||
// --- 关键修改点 1: AuthCubit 必须在 GoRouter 之前注册,并传入参数 ---
|
||
sl.registerLazySingleton(() => AuthCubit(sl<UserStorage>(), sl<TcpClient>(), sl<AppUserCubit>(), sl<NetMessageDispatcher>(), sl<AuthTcpDatasource>()));
|
||
|
||
/// 7. 路由 (Router)
|
||
sl.registerSingleton<GoRouter>(createRouter(sl<AuthCubit>()));
|
||
|
||
/// 8. 页面级 Bloc/Cubit (Factory)
|
||
sl.registerFactory(() => LoginBloc(sl()));
|
||
sl.registerFactory(() => LoginCubit(sl(), sl()));
|
||
}
|