mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2026-02-05 03:32:18 +00:00
feat(app): Вынести инициализацию приложения за splash (#4)
Co-authored-by: PetrovY <y.petrov@friflex.com>
This commit is contained in:
@@ -1,13 +1,12 @@
|
||||
import 'package:app_services/app_services.dart';
|
||||
import 'package:friflex_starter/app/app_config/app_config.dart';
|
||||
import 'package:friflex_starter/app/app_config/i_app_config.dart';
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/app/http/app_http_client.dart';
|
||||
import 'package:friflex_starter/app/http/i_http_client.dart';
|
||||
import 'package:friflex_starter/di/di_repositories.dart';
|
||||
import 'package:friflex_starter/di/di_services.dart';
|
||||
import 'package:friflex_starter/di/di_typedefs.dart';
|
||||
import 'package:friflex_starter/features/debug/i_debug_service.dart';
|
||||
import 'package:i_app_services/i_app_services.dart';
|
||||
|
||||
/// {@template dependencies_container}
|
||||
/// Контейнер для зависимостей
|
||||
@@ -22,82 +21,53 @@ final class DiContainer {
|
||||
/// Сервис для отладки, получаем из конструктора
|
||||
late final IDebugService debugService;
|
||||
|
||||
/// Сервис для работы с путями
|
||||
late final IPathProvider pathProvider;
|
||||
|
||||
/// Конфигурация приложения
|
||||
late final IAppConfig appConfig;
|
||||
|
||||
/// Сервис для работы с локальным хранилищем
|
||||
late final ISecureStorage secureStorage;
|
||||
|
||||
/// Сервис для работы с HTTP запросами
|
||||
late final IHttpClient httpClient;
|
||||
late final IHttpClient Function(IDebugService, IAppConfig) httpClientFactory;
|
||||
|
||||
/// Репозитории приложения
|
||||
late final DiRepositories repositories;
|
||||
|
||||
/// Сервисы приложения
|
||||
late final DiServices services;
|
||||
|
||||
/// Метод для инициализации зависимостей
|
||||
Future<void> init({
|
||||
required OnProgress onProgress,
|
||||
required OnComplete onComplete,
|
||||
required OnError onError,
|
||||
}) async {
|
||||
// Инициализация сервисов
|
||||
await _initServices(
|
||||
onComplete: onComplete,
|
||||
onError: onError,
|
||||
onProgress: onProgress,
|
||||
);
|
||||
|
||||
// Инициализация репозиториев
|
||||
repositories = DiRepositories();
|
||||
repositories.init(
|
||||
onProgress: onProgress,
|
||||
onComplete: onComplete,
|
||||
onError: onError,
|
||||
diContainer: this,
|
||||
);
|
||||
|
||||
onComplete('Инициализация зависимостей завершена!');
|
||||
}
|
||||
|
||||
/// Метод для инициализации сервисов
|
||||
Future<void> _initServices({
|
||||
required OnComplete onComplete,
|
||||
required OnError onError,
|
||||
required OnProgress onProgress,
|
||||
}) async {
|
||||
// Инициализация конфигурации приложения
|
||||
appConfig = switch (env) {
|
||||
AppEnv.dev => AppConfigDev(),
|
||||
AppEnv.prod => AppConfigProd(),
|
||||
AppEnv.stage => AppConfigStage()
|
||||
};
|
||||
|
||||
httpClient = AppHttpClient(
|
||||
debugService: debugService,
|
||||
appConfig: appConfig,
|
||||
);
|
||||
// Инициализация HTTP клиента
|
||||
httpClientFactory = (debugService, appConfig) => AppHttpClient(
|
||||
debugService: debugService,
|
||||
appConfig: appConfig,
|
||||
);
|
||||
|
||||
try {
|
||||
pathProvider = AppPathProvider();
|
||||
onProgress(AppPathProvider.name);
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${IPathProvider.name}',
|
||||
error,
|
||||
stackTrace,
|
||||
// Инициализация сервисов
|
||||
services = DiServices()
|
||||
..init(
|
||||
onProgress: onProgress,
|
||||
onError: onError,
|
||||
diContainer: this,
|
||||
);
|
||||
// throw Exception('Тестовая - ошибка инициализации зависимостей');
|
||||
// Инициализация репозиториев
|
||||
repositories = DiRepositories()
|
||||
..init(
|
||||
onProgress: onProgress,
|
||||
onError: onError,
|
||||
diContainer: this,
|
||||
);
|
||||
}
|
||||
|
||||
try {
|
||||
secureStorage = AppSecureStorage(secretKey: appConfig.secretKey);
|
||||
onProgress(AppSecureStorage.name);
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${ISecureStorage.name}',
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
onComplete('Инициализация зависимостей завершена!');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,20 +38,21 @@ final class DiRepositories {
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [onProgress] - обратный вызов при прогрессе
|
||||
/// - [onComplete] - обратный вызов при успешной инициализации
|
||||
/// - [diContainer] - контейнер зависимостей
|
||||
void init({
|
||||
required OnProgress onProgress,
|
||||
required OnComplete onComplete,
|
||||
required OnError onError,
|
||||
required DiContainer diContainer,
|
||||
}) {
|
||||
try {
|
||||
//Инициализация репозитория авторизации
|
||||
authRepository = lazyInitRepo<IAuthRepository>(
|
||||
authRepository = _lazyInitRepo<IAuthRepository>(
|
||||
mockFactory: AuthMockRepository.new,
|
||||
mainFactory: () => AuthRepository(
|
||||
httpClient: diContainer.httpClient,
|
||||
httpClient: diContainer.httpClientFactory(
|
||||
diContainer.debugService,
|
||||
diContainer.appConfig,
|
||||
),
|
||||
),
|
||||
onProgress: onProgress,
|
||||
environment: diContainer.env,
|
||||
@@ -67,10 +68,13 @@ final class DiRepositories {
|
||||
|
||||
try {
|
||||
// Инициализация репозитория сервиса управления токеном доступа
|
||||
mainRepository = lazyInitRepo<IMainRepository>(
|
||||
mainRepository = _lazyInitRepo<IMainRepository>(
|
||||
mockFactory: MainMockRepository.new,
|
||||
mainFactory: () => MainRepository(
|
||||
httpClient: diContainer.httpClient,
|
||||
httpClient: diContainer.httpClientFactory(
|
||||
diContainer.debugService,
|
||||
diContainer.appConfig,
|
||||
),
|
||||
),
|
||||
onProgress: onProgress,
|
||||
environment: diContainer.env,
|
||||
@@ -84,7 +88,7 @@ final class DiRepositories {
|
||||
);
|
||||
}
|
||||
|
||||
onComplete(
|
||||
onProgress(
|
||||
'Инициализация репозиториев завершена! Было подменено репозиториев - ${_mockReposToSwitch.length} (${_mockReposToSwitch.join(', ')})',
|
||||
);
|
||||
}
|
||||
@@ -96,18 +100,22 @@ final class DiRepositories {
|
||||
/// - [mockFactory] - функция - фабрика для инициализации репозитория для управления моковыми запросами
|
||||
/// - [mainFactory] - функция - фабрика для инициализации основного репозиторий
|
||||
/// - [onProgress] - обратный вызов при прогрессе
|
||||
T lazyInitRepo<T extends DiBaseRepo>({
|
||||
T _lazyInitRepo<T extends DiBaseRepo>({
|
||||
required AppEnv environment,
|
||||
required T Function() mainFactory,
|
||||
required T Function() mockFactory,
|
||||
required OnProgress onProgress,
|
||||
}) {
|
||||
final mockRepo = mockFactory();
|
||||
final mainRepo = mainFactory();
|
||||
|
||||
final repo = switch (environment) {
|
||||
AppEnv.dev => mockFactory(),
|
||||
AppEnv.prod => mainFactory(),
|
||||
AppEnv.dev => mockRepo,
|
||||
AppEnv.prod => mainRepo,
|
||||
AppEnv.stage =>
|
||||
_mockReposToSwitch.contains(mockFactory().name) ? mockFactory() : mainFactory(),
|
||||
_mockReposToSwitch.contains(mockRepo.name) ? mockRepo : mainRepo,
|
||||
};
|
||||
|
||||
onProgress(repo.name);
|
||||
return repo;
|
||||
}
|
||||
|
||||
50
lib/di/di_services.dart
Normal file
50
lib/di/di_services.dart
Normal file
@@ -0,0 +1,50 @@
|
||||
import 'package:app_services/app_services.dart';
|
||||
import 'package:friflex_starter/di/di_container.dart';
|
||||
import 'package:friflex_starter/di/di_typedefs.dart';
|
||||
import 'package:i_app_services/i_app_services.dart';
|
||||
|
||||
/// Класс для инициализации сервисов
|
||||
final class DiServices {
|
||||
/// Сервис для работы с путями
|
||||
late final IPathProvider pathProvider;
|
||||
|
||||
/// Сервис для работы с локальным хранилищем
|
||||
late final ISecureStorage secureStorage;
|
||||
|
||||
/// Метод для инициализации репозиториев в приложении
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [onProgress] - обратный вызов при прогрессе
|
||||
/// - [diContainer] - контейнер зависимостей
|
||||
/// - [onError] - обратный вызов при ошибке
|
||||
void init({
|
||||
required OnProgress onProgress,
|
||||
required OnError onError,
|
||||
required DiContainer diContainer,
|
||||
}) {
|
||||
try {
|
||||
pathProvider = AppPathProvider();
|
||||
onProgress(AppPathProvider.name);
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${IPathProvider.name}',
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
try {
|
||||
secureStorage = AppSecureStorage(
|
||||
secretKey: diContainer.appConfig.secretKey,
|
||||
);
|
||||
onProgress(AppSecureStorage.name);
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${ISecureStorage.name}',
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
|
||||
onProgress('Инициализация сервисов завершена!');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user