Files
flutterApp/lib/core/di/injection.dart

696 lines
30 KiB
Dart
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import 'package:dio/dio.dart';
import 'package:flutter/widgets.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/v2/device_list/presentation/float_bar/cubit/float_bar_setting_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:maibu_satabot_v2/features/remote_control/domain/usecase/request_control_permission_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/get_work_records_by_site_id_usecase.dart';
import '../../features/devices/domain/usecases/create_device_task_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/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/presentation/bloc/remote_control_cubit.dart';
import '../../features/v2/home/data/datasources/home_remote_datasource.dart';
import '../../features/v2/home/data/datasources/site_datasource.dart';
import '../../features/v2/home/data/datasources/site_datasource_impl.dart';
import '../../features/v2/home/data/repositories/home_repository_impl.dart';
import '../../features/v2/home/data/repositories/site_repository_impl.dart';
import '../../features/v2/home/domain/repositories/home_repository.dart';
import '../../features/v2/home/domain/repositories/site_repository.dart';
import '../../features/v2/home/domain/usecases/get_home_data_usecase.dart';
import '../../features/v2/home/domain/usecases/get_site_list_usecase.dart';
import '../../features/v2/home/presentation/bloc/home_v2_bloc.dart';
import '../../features/v2/site/presentation/cubit/site_cubit.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/domain/usecases/get_all_devices_usecase.dart';
import '../../features/v2/device_list/domain/usecases/get_device_by_spilt_code_usecase.dart';
import '../../features/v2/device_list/presentation/bloc/device_status_bloc.dart'
as device_v2_bloc;
import '../../features/v2/device_list/data/datasources/drone_station_datasource.dart';
import '../../features/v2/device_list/data/datasources/drone_station_datasource_impl.dart';
import '../../features/v2/device_list/data/repositories/drone_station_repository_impl.dart';
import '../../features/v2/device_list/domain/repositories/drone_station_repository.dart';
import '../../features/v2/device_list/domain/usecases/get_drone_station_list_usecase.dart';
import '../../features/v2/device_list/domain/usecases/get_video_stream_usecase.dart';
import '../../features/v2/device_list/domain/usecases/get_uav_video_stream_usecase.dart';
import '../../features/v2/device_list/domain/usecases/update_flight_task_status_usecase.dart';
import '../../features/v2/device_list/domain/usecases/pause_flight_task_usecase.dart';
import '../../features/v2/device_list/domain/usecases/return_home_usecase.dart';
import '../../features/v2/device_list/presentation/bloc/drone_station_bloc.dart';
import '../../features/v2/device_list/presentation/bloc/robot_list_bloc.dart';
import '../../features/v2/device_list/presentation/bloc/device_realtime_bloc.dart';
import '../../features/v2/device_list/data/datasources/bind_device_datasource.dart';
import '../../features/v2/device_list/data/datasources/impl/bind_device_datasource_impl.dart';
import '../../features/v2/device_list/data/repositories/bind_device_repository_impl.dart';
import '../../features/v2/device_list/domain/repositories/bind_device_repository.dart';
import '../../features/v2/device_list/domain/usecases/bind_device_usecases.dart';
import '../../features/v2/device_list/presentation/cubit/bind_device_cubit.dart';
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 '../../features/v2/waring_center/data/datasources/alarm_detail_remote_datasource.dart';
import '../../features/v2/waring_center/data/datasources/impl/alarm_detail_remote_datasource_impl.dart';
import '../../features/v2/waring_center/data/repositories/alarm_detail_repository_impl.dart';
import '../../features/v2/waring_center/domain/repositories/alarm_detail_repository.dart';
import '../../features/v2/waring_center/domain/usecases/get_alarm_detail_usecase.dart';
import '../../features/v2/waring_center/domain/usecases/alarm_actions_usecase.dart';
import '../../features/v2/waring_center/presentation/bloc/alarm_detail_cubit.dart';
import '../../features/v2/message_center/data/datasources/message_center_remote_datasource.dart';
import '../../features/v2/message_center/data/datasources/impl/message_center_remote_datasource_impl.dart';
import '../../features/v2/message_center/data/repositories/message_center_repository_impl.dart';
import '../../features/v2/message_center/domain/repositories/message_center_repository.dart';
import '../../features/v2/message_center/domain/usecases/message_center_usecase.dart';
import '../../features/v2/message_center/presentation/bloc/message_center_cubit.dart';
import '../../features/v2/work_order/data/datasources/work_order_remote_datasource.dart';
import '../../features/v2/work_order/data/datasources/work_order_remote_datasource_impl.dart';
import '../../features/v2/work_order/data/repositories/work_order_repository_impl.dart';
import '../../features/v2/work_order/domain/repositories/work_order_repository.dart';
import '../../features/v2/work_order/domain/usecases/work_order_usecases.dart';
import '../../features/v2/work_order/presentation/cubit/work_order_cubit.dart';
import '../../features/v2/device_run_param/data/datasources/device_run_param_remote_datasource.dart';
import '../../features/v2/device_run_param/data/datasources/device_run_param_remote_datasource_impl.dart';
import '../../features/v2/device_run_param/data/repositories/device_run_param_repository_impl.dart';
import '../../features/v2/device_run_param/domain/repositories/device_run_param_repository.dart';
import '../../features/v2/device_run_param/domain/usecases/device_run_param_usecases.dart';
import '../services/device_permission_service.dart';
import '../../features/devices/data/datasources/device_task_datasource.dart';
import '../../features/devices/data/repositories/device_task_repository_impl.dart';
import '../../features/devices/domain/repositories/device_task_repository.dart';
import '../../features/devices/domain/usecases/get_device_task_pool_usecase.dart';
import '../../features/devices/domain/usecases/cancel_task_usecase.dart';
import '../../features/devices/domain/usecases/pause_task_usecase.dart';
import '../../features/devices/domain/usecases/recovery_task_usecase.dart';
import '../../features/devices/presentation/bloc/device_task_cubit.dart';
import '../app/app_user_cubit.dart';
import '../localization/locale_cubit.dart';
import '../theme/theme_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 '../network/tcp/tcp_status_cubit.dart';
import '../network/mqtt/domain/interfaces/mqtt_client.dart';
import '../network/mqtt/data/infrastructure/mqtt_client_impl.dart';
import '../network/mqtt/data/datasources/drone_osd_datasource.dart';
import '../network/mqtt/data/datasources/task_message_datasource.dart';
import '../network/mqtt/data/datasources/mower_realtime_datasource.dart';
import '../network/mqtt/domain/repositories/drone_osd_repository.dart';
import '../network/mqtt/domain/repositories/task_message_repository.dart';
import '../network/mqtt/domain/repositories/mower_realtime_repository.dart';
import '../network/mqtt/data/repositories/drone_osd_repository_impl.dart';
import '../network/mqtt/data/repositories/task_message_repository_impl.dart';
import '../network/mqtt/data/repositories/mower_realtime_repository_impl.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 MQTT Clients - 三个独立的 MQTT 客户端实例
sl.registerLazySingleton<MqttClient>(
() => MqttClientImpl(clientName: 'droneOsdClient'),
instanceName: 'droneOsdClient',
);
sl.registerLazySingleton<MqttClient>(
() => MqttClientImpl(clientName: 'taskMessageClient'),
instanceName: 'taskMessageClient',
);
// 🔥 割草机机器状态专用 MQTT 客户端(1.95.137.212:59007)
sl.registerLazySingleton<MqttClient>(
() => MqttClientImpl(clientName: 'mowerRealtimeClient'),
instanceName: 'mowerRealtimeClient',
);
/// 1.1.4 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());
/// 1.4 --- Route Observer (路由监听器) ---
sl.registerLazySingleton<RouteObserver>(
() => RouteObserver<ModalRoute<void>>(),
);
/// 1.5 --- MQTT Data Sources ---
/// 改为 LazySingleton:列表页预启动订阅和详情页共享同一实例,stream 互通
sl.registerLazySingleton<DroneOsdDataSource>(
() =>
DroneOsdDataSourceImpl(sl<MqttClient>(instanceName: 'droneOsdClient')),
);
sl.registerFactory<TaskMessageDataSource>(
() => TaskMessageDataSourceImpl(
sl<MqttClient>(instanceName: 'taskMessageClient'),
),
);
/// 割草机机器状态(MQTT):车辆实时+定位,LazySingleton 跨页面共享同一订阅
/// 🔥 使用独立 MQTT 连接 mowerRealtimeClient(1.95.137.212:59007)
sl.registerLazySingleton<MowerRealtimeDataSource>(
() => MowerRealtimeDataSourceImpl(
sl<MqttClient>(instanceName: 'mowerRealtimeClient'),
),
);
/// 1.5 --- MQTT Repositories ---
sl.registerLazySingleton<DroneOsdRepository>(
() => DroneOsdRepositoryImpl(sl<DroneOsdDataSource>()),
);
sl.registerLazySingleton<TaskMessageRepository>(
() => TaskMessageRepositoryImpl(sl<TaskMessageDataSource>()),
);
sl.registerLazySingleton<MowerRealtimeRepository>(
() => MowerRealtimeRepositoryImpl(sl<MowerRealtimeDataSource>()),
);
/// 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()));
// Site (场站)
sl.registerLazySingleton<SiteDataSource>(
() => SiteDataSourceImpl(sl<Dio>(), sl<UserStorage>(), sl<AppUserCubit>()),
);
sl.registerLazySingleton<SiteRepository>(() => SiteRepositoryImpl(sl()));
sl.registerLazySingleton<GetSiteListUseCase>(() => GetSiteListUseCase(sl()));
sl.registerFactory<HomeV2Bloc>(
() => HomeV2Bloc(sl(), sl(), sl<AppUserCubit>(), sl<SiteCubit>()),
);
/// Device Status V2
sl.registerLazySingleton<device_v2.DeviceRemoteDataSource>(
() => device_v2.DeviceRemoteDataSourceImpl(sl<Dio>()),
);
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.registerLazySingleton<GetAllDevicesUseCase>(
() => GetAllDevicesUseCase(repository: sl()),
);
sl.registerLazySingleton<GetDeviceBySpiltCodeUseCase>(
() => GetDeviceBySpiltCodeUseCase(repository: sl()),
);
sl.registerFactory<device_v2_bloc.DeviceStatusBloc>(
() => device_v2_bloc.DeviceStatusBloc(sl()),
);
/// Drone Station V2
sl.registerLazySingleton<DroneStationDataSource>(
() => DroneStationDataSourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<DroneStationRepository>(
() => DroneStationRepositoryImpl(sl()),
);
sl.registerLazySingleton<GetDroneStationListUseCase>(
() => GetDroneStationListUseCase(sl()),
);
sl.registerLazySingleton<GetUAVDetailUseCase>(
() => GetUAVDetailUseCase(sl()),
);
sl.registerLazySingleton<GetVideoStreamUseCase>(
() => GetVideoStreamUseCase(sl()),
);
sl.registerLazySingleton<GetUavVideoStreamUseCase>(
() => GetUavVideoStreamUseCase(sl()),
);
sl.registerLazySingleton<UpdateFlightTaskStatusUseCase>(
() => UpdateFlightTaskStatusUseCase(sl()),
);
sl.registerLazySingleton<PauseFlightTaskUseCase>(
() => PauseFlightTaskUseCase(sl()),
);
sl.registerLazySingleton<ReturnHomeUseCase>(() => ReturnHomeUseCase(sl()));
sl.registerFactory<DroneStationBloc>(
() => DroneStationBloc(sl(), sl(), sl(), sl()),
);
/// Robot List V2
sl.registerFactory<RobotListBloc>(() => RobotListBloc(sl<Dio>()));
/// Device Realtime V2 (MQTT)
sl.registerFactory<DeviceRealtimeBloc>(
() => DeviceRealtimeBloc(sl<TaskMessageRepository>()),
);
/// Alarm Center V2
sl.registerLazySingleton<AlarmRemoteDataSource>(
() => AlarmRemoteDataSourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<AlarmRepository>(() => AlarmRepositoryImpl(sl()));
sl.registerLazySingleton<GetAlarmListUseCase>(
() => GetAlarmListUseCase(sl()),
);
sl.registerLazySingleton<GetAlarmCountUseCase>(
() => GetAlarmCountUseCase(sl()),
);
sl.registerFactory<AlarmCubit>(() => AlarmCubit(getAlarmListUseCase: sl()));
/// Alarm Detail V2
sl.registerLazySingleton<AlarmDetailRemoteDataSource>(
() => AlarmDetailRemoteDataSourceImpl(sl()),
);
sl.registerLazySingleton<AlarmDetailRepository>(
() => AlarmDetailRepositoryImpl(sl()),
);
sl.registerLazySingleton<GetAlarmDetailUseCase>(
() => GetAlarmDetailUseCase(sl()),
);
sl.registerLazySingleton<ConfirmAlarmUseCase>(
() => ConfirmAlarmUseCase(sl()),
);
sl.registerLazySingleton<HandleAlarmUseCase>(() => HandleAlarmUseCase(sl()));
sl.registerLazySingleton<AIDiagnosisUseCase>(() => AIDiagnosisUseCase(sl()));
sl.registerFactory<AlarmDetailCubit>(
() => AlarmDetailCubit(
getAlarmDetailUseCase: sl(),
confirmAlarmUseCase: sl(),
handleAlarmUseCase: sl(),
aiDiagnosisUseCase: sl(),
),
);
/// 5. 状态管理 (Cubit/Bloc)
sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册
// TCP状态管理 Cubit
sl.registerLazySingleton(() => TcpStatusCubit());
// 🔥 SiteCubit (全局共享,持久化选中场站)
sl.registerLazySingleton(() => SiteCubit(sl<SharedPreferences>()));
// 🔥 FloatBarSettingService (全局共享,控制悬浮条显示)
sl.registerLazySingleton(
() => FloatBarSettingService(sl<SharedPreferences>()),
);
// 🔥 语言管理 Cubit (单例)
sl.registerLazySingleton(() => LocaleCubit());
// 🔥 主题管理 Cubit (单例,管理亮/暗/跟随系统)
sl.registerLazySingleton(() => ThemeCubit());
// Tab 配置 Cubit (单例)
sl.registerLazySingleton(() => TabConfigCubit(sl<SharedPreferences>()));
sl.registerLazySingleton(() => GetDeviceLocationUseCase(sl()));
sl.registerLazySingleton(
() => DevicesCubit(
sl(), // repository
sl(), // GetUserDeviceUseCase
sl(), // GetDeviceLocationUseCase
sl(), // GetWorkRecordUseCase
sl(), // GetWorkRecordsBySiteIdUseCase (NEW)
sl(), // DeleteWorkRecordUseCase
sl(), // UnbindDeviceUseCase
sl(), // UpdateDevicenameUsecase
sl(), // SelectWorkRecordUseCase
sl(), // SaveWorkRecordUseCase
sl(), // GeneratePathUseCase
sl(), // RoutePlanningUseCase
sl(), // BindDeviceUseCase
sl(), // DeviceStatusBloc
sl(), // TcpClient
sl(), // PathPlanningService
),
);
// DeviceStatusBloc 必须在 RemoteControlCubit 之前注册(单例)
sl.registerLazySingleton(
() => DeviceStatusBloc(
sl<NetMessageDispatcher>(),
client: sl<TcpClient>(), // 🔥 传入 TcpClient
),
);
// 🔥 RemoteControlCubit 注入 DeviceStatusBloc(单例模式,全局共享)
sl.registerLazySingleton(
() => RemoteControlCubit(
sl(), // RemoteControlRepository
sl(), // RequestControlPermissionUseCase
sl(), // DeviceRepository
sl<TcpClient>(), // TcpClient
sl(), // NetMessageDispatcher
sl(), // DeviceStatusBloc
),
);
// 🔥 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>()));
/// 根据场站ID获取工作记录(XML格式)
sl.registerLazySingleton(
() => GetWorkRecordsBySiteIdUseCase(sl<PathRepository>()),
);
/// 创建设备任务(通过接口执行作业)
sl.registerLazySingleton(() => CreateDeviceTaskUseCase(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()));
/// 9. 消息中心 (Message Center)
sl.registerLazySingleton<MessageCenterRemoteDataSource>(
() => MessageCenterRemoteDataSourceImpl(),
);
sl.registerLazySingleton<MessageCenterRepository>(
() => MessageCenterRepositoryImpl(sl()),
);
sl.registerLazySingleton<GetMessageListUseCase>(
() => GetMessageListUseCase(sl()),
);
sl.registerLazySingleton<MarkAllAsReadUseCase>(
() => MarkAllAsReadUseCase(sl()),
);
sl.registerFactory<MessageCenterCubit>(
() => MessageCenterCubit(
getMessageListUseCase: sl(),
markAllAsReadUseCase: sl(),
),
);
/// 10. 设备任务管理 (Device Task)
sl.registerLazySingleton<DeviceTaskDatasource>(
() => DeviceTaskDatasourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<DeviceTaskRepository>(
() => DeviceTaskRepositoryImpl(datasource: sl<DeviceTaskDatasource>()),
);
sl.registerLazySingleton(() => GetDeviceTaskPoolUseCase(sl()));
sl.registerLazySingleton(() => CancelTaskUseCase(sl()));
sl.registerLazySingleton(() => PauseTaskUseCase(sl()));
sl.registerLazySingleton(() => RecoveryTaskUseCase(sl()));
sl.registerLazySingleton(() => DeviceTaskCubit(sl(), sl(), sl(), sl()));
/// 11. 工单管理 (Work Order)
sl.registerLazySingleton<WorkOrderRemoteDataSource>(
() => WorkOrderRemoteDataSourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<WorkOrderRepository>(
() => WorkOrderRepositoryImpl(remoteDataSource: sl()),
);
sl.registerLazySingleton<GetWorkOrderListUseCase>(
() => GetWorkOrderListUseCase(sl()),
);
sl.registerLazySingleton<GetWorkOrderDetailUseCase>(
() => GetWorkOrderDetailUseCase(sl()),
);
sl.registerLazySingleton<DispatchWorkOrderUseCase>(
() => DispatchWorkOrderUseCase(sl()),
);
sl.registerLazySingleton<SuspendWorkOrderUseCase>(
() => SuspendWorkOrderUseCase(sl()),
);
sl.registerLazySingleton<CompleteWorkOrderUseCase>(
() => CompleteWorkOrderUseCase(sl()),
);
sl.registerLazySingleton<StartWorkOrderUseCase>(
() => StartWorkOrderUseCase(sl()),
);
sl.registerFactory<WorkOrderCubit>(
() => WorkOrderCubit(
getWorkOrderListUseCase: sl(),
getWorkOrderDetailUseCase: sl(),
dispatchWorkOrderUseCase: sl(),
suspendWorkOrderUseCase: sl(),
completeWorkOrderUseCase: sl(),
startWorkOrderUseCase: sl(),
),
);
/// 12. 设备运行参数管理 (Device Run Param)
sl.registerLazySingleton<DeviceRunParamRemoteDataSource>(
() => DeviceRunParamRemoteDataSourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<DeviceRunParamRepository>(
() => DeviceRunParamRepositoryImpl(remoteDataSource: sl()),
);
sl.registerLazySingleton<GetDeviceRunParamUseCase>(
() => GetDeviceRunParamUseCase(sl()),
);
sl.registerLazySingleton<SaveDeviceRunParamUseCase>(
() => SaveDeviceRunParamUseCase(sl()),
);
/// 13. 设备操作权限校验服务 (Device Permission Service)
sl.registerLazySingleton<DevicePermissionService>(
() => DevicePermissionService(sl<Dio>()),
);
/// 14. 绑定智能装备 (Bind Device)
sl.registerLazySingleton<BindDeviceDatasource>(
() => BindDeviceDatasourceImpl(sl<Dio>()),
);
sl.registerLazySingleton<BindDeviceRepository>(
() => BindDeviceRepositoryImpl(sl<BindDeviceDatasource>()),
);
sl.registerLazySingleton<GetOrgListUseCase>(() => GetOrgListUseCase(sl()));
sl.registerLazySingleton<GetSitesByOrgUseCase>(
() => GetSitesByOrgUseCase(sl()),
);
sl.registerLazySingleton<GetUsersBySiteUseCase>(
() => GetUsersBySiteUseCase(sl()),
);
sl.registerLazySingleton<BindDeviceV2UseCase>(
() => BindDeviceV2UseCase(sl()),
);
sl.registerLazySingleton<IsDeviceAtSiteUseCase>(
() => IsDeviceAtSiteUseCase(sl()),
);
sl.registerFactory<BindDeviceCubit>(
() => BindDeviceCubit(sl(), sl(), sl(), sl(), sl(), sl<AppUserCubit>()),
);
}