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 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())); sl.registerFactory(() => HomeV2Bloc(sl())); /// Device Status V2 sl.registerLazySingleton(() => device_v2.DeviceRemoteDataSourceImpl()); sl.registerLazySingleton(() => device_v2_repo.DeviceRepositoryImpl(remoteDataSource: sl())); sl.registerLazySingleton(() => device_v2_usecase.GetDeviceStatusDataUseCase(repository: sl())); sl.registerFactory(() => device_v2_bloc.DeviceStatusBloc(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(), )); /// 5. 状态管理 (Cubit/Bloc) sl.registerLazySingleton(() => AppUserCubit()); // AuthCubit 依赖它,必须先注册 // 🔥 语言管理 Cubit (单例) sl.registerLazySingleton(() => LocaleCubit()); // Tab 配置 Cubit (单例) sl.registerLazySingleton(() => TabConfigCubit(sl())); 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(), client: sl(), // 🔥 传入 TcpClient )); // 🔥 RemoteControlCubit 注入 DeviceStatusBloc(工厂模式,每次新建) sl.registerFactory(() => RemoteControlCubit(sl(), sl(), sl(), sl())); // 🔥 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())); /// 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())); }