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: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/get_work_records_by_site_id_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/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/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/presentation/bloc/drone_station_bloc.dart'; import '../../features/v2/device_list/presentation/bloc/robot_list_bloc.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/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 '../../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 '../router/app_router.dart'; import '../storage/impl/user_storage_impl.dart'; import '../storage/user_storage.dart'; final sl = GetIt.instance; Future init() async { /// 1. 底层工具与存储 (最底层) /// 1.1 --- Network --- /// 1.1.1 Dio:Http客户端 sl.registerLazySingleton(() => DioClient.create()); /// 1.1.2 TcpClient:TCP客户端 sl.registerLazySingleton( () => TcpClient( sl(), getUserDeviceUseCase: sl(), switchDeviceUseCase: sl(), ), ); sl.registerLazySingleton(() => PathPlanningService()); /// 1.1.3 NetMessageDispatcher:消息调度器,并将 TcpClient 注入给它 sl.registerLazySingleton( () => NetMessageDispatcher( sl(), sl(), sl(), getAppState: () => sl().state.appState, ), ); /// 1.2 --- 本地存储 (LocalStorage) --- /// 1.2.1 SharedPreferences:本地存储库 final sharedPrefs = await SharedPreferences.getInstance(); sl.registerLazySingleton(() => sharedPrefs); /// 1.2.2 UserStorage:用户存储库 sl.registerLazySingleton( // 必须先注册上面本地存储库的实例 () => UserStorageImpl(sl()), ); /// 1.3 Log工具Sentry sl.registerLazySingleton(() => SentryLoggerImpl()); /// 2. 数据源 (DataSource) sl.registerLazySingleton( () => AuthHttpDataSourceImpl(sl()), ); sl.registerLazySingleton( () => DeviceHttpDatasourceImpl(sl(), sl()), // ); sl.registerLazySingleton( () => RemoteHttpDatasource(sl(), sl()), ); sl.registerLazySingleton( () => RemoteTcpDatasource(sl(), sl()), ); /// 3. 仓库 (Repository) sl.registerLazySingleton( () => AuthRepositoryImpl( httpRemote: sl(), // 自动寻找已注册的 LoginRemoteDataSource localTokenStorage: sl(), // 自动寻找已注册的 TokenStorage ), ); // 1. 注册 UpdateNameUsecase sl.registerLazySingleton( () => UpdateNameUsecase(sl()), // 注入 MyRepository 实例 ); sl.registerLazySingleton( () => MyRepositoryImpl( userStorage: sl(), // 注入 UserStorage ), ); // 2. 注册 MyCubit sl.registerLazySingleton( () => MyCubit( sl(), // 注入仓库 sl(), // 注入 UseCase ), ); sl.registerLazySingleton( () => RoutePlanningRepositoryImpl(tcp: sl()), // ); sl.registerLazySingleton( () => RoutePlanningUseCase(sl()), // ); //工作历史 sl.registerLazySingleton( () => DeviceHostrityWorkRepositoryImpl( client: sl(), // 使用 Dio 实例 userStorage: sl(), ), ); sl.registerLazySingleton(() => DeviceRepositoryImpl(sl())); sl.registerLazySingleton( () => 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(sl()), ); sl.registerLazySingleton(() => UnbindDeviceUseCase(sl())); sl.registerLazySingleton(() => BindDeviceUseCase(sl())); sl.registerLazySingleton(() => UpdateDevicenameUsecase(sl())); sl.registerLazySingleton( () => SaveWorkRecordUseCase(sl()), ); sl.registerLazySingleton( () => SwitchDeviceUseCase(sl()), ); sl.registerLazySingleton( () => AuthTcpDatasourceImpl( sl(), sl(), getUserDeviceUseCase: sl(), switchDeviceUseCase: sl(), ), ); sl.registerLazySingleton( () => RequestControlPermissionUseCase(sl()), ); /// Home V2 sl.registerLazySingleton( () => HomeRemoteDataSourceImpl(), ); sl.registerLazySingleton(() => HomeRepositoryImpl(sl())); sl.registerLazySingleton(() => GetHomeDataUseCase(sl())); // Site (场站) sl.registerLazySingleton( () => SiteDataSourceImpl(sl(), sl(), sl()), ); sl.registerLazySingleton(() => SiteRepositoryImpl(sl())); sl.registerLazySingleton(() => GetSiteListUseCase(sl())); sl.registerFactory( () => HomeV2Bloc(sl(), sl(), sl(), sl()), ); /// Device Status V2 sl.registerLazySingleton( () => device_v2.DeviceRemoteDataSourceImpl(sl()), ); sl.registerLazySingleton( () => device_v2_repo.DeviceRepositoryImpl(remoteDataSource: sl()), ); sl.registerLazySingleton( () => device_v2_usecase.GetDeviceStatusDataUseCase(repository: sl()), ); sl.registerFactory( () => device_v2_bloc.DeviceStatusBloc(sl()), ); /// Drone Station V2 sl.registerLazySingleton( () => DroneStationDataSourceImpl(sl()), ); sl.registerLazySingleton( () => DroneStationRepositoryImpl(sl()), ); sl.registerLazySingleton( () => GetDroneStationListUseCase(sl()), ); sl.registerLazySingleton( () => GetUAVDetailUseCase(sl()), ); sl.registerLazySingleton( () => GetVideoStreamUseCase(sl()), ); sl.registerLazySingleton( () => GetUavVideoStreamUseCase(sl()), ); sl.registerLazySingleton( () => UpdateFlightTaskStatusUseCase(sl()), ); sl.registerFactory( () => DroneStationBloc(sl(), sl(), sl(), sl()), ); /// Robot List V2 sl.registerFactory(() => RobotListBloc(sl())); /// Alarm Center V2 sl.registerLazySingleton( () => AlarmRemoteDataSourceImpl(), ); sl.registerLazySingleton(() => AlarmRepositoryImpl(sl())); sl.registerLazySingleton( () => GetAlarmListUseCase(sl()), ); sl.registerLazySingleton( () => GetAlarmCountUseCase(sl()), ); sl.registerFactory( () => AlarmCubit(getAlarmListUseCase: sl(), getAlarmCountUseCase: sl()), ); /// Alarm Detail V2 sl.registerLazySingleton( () => AlarmDetailRemoteDataSourceImpl(), ); sl.registerLazySingleton( () => AlarmDetailRepositoryImpl(sl()), ); sl.registerLazySingleton( () => GetAlarmDetailUseCase(sl()), ); sl.registerLazySingleton( () => ConfirmAlarmUseCase(sl()), ); sl.registerLazySingleton(() => AIDiagnosisUseCase(sl())); sl.registerFactory( () => AlarmDetailCubit( getAlarmDetailUseCase: sl(), confirmAlarmUseCase: sl(), aiDiagnosisUseCase: sl(), ), ); /// 5. 状态管理 (Cubit/Bloc) sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册 // TCP状态管理 Cubit sl.registerLazySingleton(() => TcpStatusCubit()); // 🔥 SiteCubit (全局共享,持久化选中场站) sl.registerLazySingleton(() => SiteCubit(sl())); // 🔥 语言管理 Cubit (单例) sl.registerLazySingleton(() => LocaleCubit()); // Tab 配置 Cubit (单例) sl.registerLazySingleton(() => TabConfigCubit(sl())); 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(), client: sl(), // 🔥 传入 TcpClient ), ); // 🔥 RemoteControlCubit 注入 DeviceStatusBloc(单例模式,全局共享) sl.registerLazySingleton( () => RemoteControlCubit( sl(), // RemoteControlRepository sl(), // RequestControlPermissionUseCase sl(), // DeviceRepository sl(), // TcpClient sl(), // NetMessageDispatcher sl(), // DeviceStatusBloc ), ); // 🔥 PermissionRequestBloc 用于首页权限弹窗(单例,通过 NetMessageDispatcher 监听) sl.registerLazySingleton( () => PermissionRequestBloc( sl(), sl(), ), ); /// . 路径生成 sl.registerLazySingleton( () => PathHttpDatasourceImpl( // 需先注册 http.Client(见下方) sl(), ), ); sl.registerLazySingleton( () => PathRepositoryImpl(datasource: sl()), ); sl.registerLazySingleton( () => GeneratePathUseCaseImpl(sl()), ); ///.路径获取和删除 sl.registerLazySingleton(() => GetWorkRecordUseCase(sl())); sl.registerLazySingleton(() => DeleteWorkRecordUseCase(sl())); /// 根据场站ID获取工作记录(XML格式) sl.registerLazySingleton( () => GetWorkRecordsBySiteIdUseCase(sl()), ); /// 创建设备任务(通过接口执行作业) sl.registerLazySingleton( () => CreateDeviceTaskUseCase(sl()), ); /// 6. 认证 (Auth) // --- 关键修改点 1: AuthCubit 必须在 GoRouter 之前注册,并传入参数 --- sl.registerLazySingleton( () => AuthCubit( sl(), sl(), sl(), sl(), sl(), ), ); /// 7. 路由 (Router) sl.registerSingleton(createRouter(sl())); /// 8. 页面级 Bloc/Cubit (Factory) sl.registerFactory(() => LoginBloc(sl())); sl.registerFactory(() => LoginCubit(sl(), sl())); /// 9. 消息中心 (Message Center) sl.registerLazySingleton( () => MessageCenterRemoteDataSourceImpl(), ); sl.registerLazySingleton( () => MessageCenterRepositoryImpl(sl()), ); sl.registerLazySingleton( () => GetMessageListUseCase(sl()), ); sl.registerLazySingleton( () => MarkAllAsReadUseCase(sl()), ); sl.registerFactory( () => MessageCenterCubit( getMessageListUseCase: sl(), markAllAsReadUseCase: sl(), ), ); /// 10. 设备任务管理 (Device Task) sl.registerLazySingleton( () => DeviceTaskDatasourceImpl(sl()), ); sl.registerLazySingleton( () => DeviceTaskRepositoryImpl(datasource: sl()), ); sl.registerLazySingleton(() => GetDeviceTaskPoolUseCase(sl())); sl.registerLazySingleton(() => CancelTaskUseCase(sl())); sl.registerLazySingleton(() => PauseTaskUseCase(sl())); sl.registerLazySingleton(() => RecoveryTaskUseCase(sl())); sl.registerFactory( () => DeviceTaskCubit( sl(), sl(), sl(), sl(), ), ); }