import 'package:flutter_secure_storage/flutter_secure_storage.dart'; import 'package:get_it/get_it.dart'; import 'package:http/http.dart' as http; import 'package:shared_preferences/shared_preferences.dart'; import '../../features/auth/data/datasources/auth_local_datasource.dart'; import '../../features/auth/data/datasources/auth_remote_datasource.dart'; import '../../features/auth/data/repositories/auth_repository_impl.dart'; import '../../features/auth/domain/repositories/auth_repository.dart'; import '../../features/auth/presentation/viewmodels/auth_viewmodel.dart'; import '../../features/settings/presentation/viewmodels/settings_viewmodel.dart'; import '../../features/tasks/presentation/viewmodels/daily_tasks_viewmodel.dart'; import '../../features/tasks/presentation/viewmodels/task_form_viewmodel.dart'; import '../../features/tasks/domain/repositories/task_repository.dart'; import '../../features/tasks/data/repositories/task_repository_impl.dart'; import '../../features/tasks/data/datasources/task_remote_datasource.dart'; import '../../features/settings/data/settings_local_datasource.dart'; import '../logging/app_logger.dart'; import '../network/authenticated_client.dart'; final getIt = GetIt.instance; Future init() async { // External final sharedPreferences = await SharedPreferences.getInstance(); getIt.registerSingleton(sharedPreferences); const flutterSecureStorage = FlutterSecureStorage( aOptions: AndroidOptions(encryptedSharedPreferences: true), iOptions: IOSOptions(accessibility: KeychainAccessibility.first_unlock), ); getIt.registerSingleton(flutterSecureStorage); // Logger getIt.registerSingleton(AppLogger()); // Auth Data sources getIt.registerLazySingleton( () => AuthLocalDataSourceImpl(storage: getIt()), ); getIt.registerLazySingleton( () => AuthRemoteDataSourceImpl(logger: getIt()), ); // Auth Repository getIt.registerLazySingleton( () => AuthRepositoryImpl( remoteDataSource: getIt(), localDataSource: getIt(), logger: getIt(), ), ); // Auth ViewModel (singleton for global state) getIt.registerSingleton( AuthViewModel(repository: getIt(), logger: getIt()), ); // Authenticated HTTP Client getIt.registerLazySingleton( () => AuthenticatedClient( localDataSource: getIt(), authRepository: getIt(), ), ); // Task Data sources getIt.registerLazySingleton( () => TaskRemoteDataSourceImpl( logger: getIt(), client: getIt(), ), ); getIt.registerLazySingleton( () => SettingsLocalDataSourceImpl(sharedPreferences: getIt()), ); // Repositories getIt.registerLazySingleton( () => TaskRepositoryImpl(remoteDataSource: getIt(), logger: getIt()), ); // ViewModels getIt.registerFactory( () => DailyTasksViewModel(repository: getIt(), logger: getIt()), ); getIt.registerFactory( () => TaskFormViewModel(repository: getIt(), logger: getIt()), ); getIt.registerLazySingleton( () => SettingsViewModel(dataSource: getIt(), logger: getIt()), ); }