Merge branch 'main' into feat/перенести-роутер-ближе-к-месту-инициализации

This commit is contained in:
Artem
2025-12-30 12:03:18 +07:00
34 changed files with 930 additions and 741 deletions

View File

@@ -4,23 +4,17 @@ import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:friflex_starter/app/app.dart';
import 'package:friflex_starter/app/app_env.dart';
import 'package:friflex_starter/app/app_root.dart';
import 'package:friflex_starter/di/di_container.dart';
import 'package:friflex_starter/features/debug/debug_service.dart';
import 'package:friflex_starter/features/debug/i_debug_service.dart';
import 'package:friflex_starter/features/error/error_screen.dart';
import 'package:friflex_starter/router/app_router.dart';
import 'package:friflex_starter/runner/timer_runner.dart';
import 'package:go_router/go_router.dart';
part 'errors_handlers.dart';
/// Время ожидания инициализации зависимостей
/// Если время превышено, то будет показан экран ошибки
/// В дальнейшем нужно убрать в env
const _initTimeout = Duration(seconds: 7);
/// Класс, реализующий раннер для конфигурирования приложения при запуске
///
/// Порядок инициализации:
@@ -48,7 +42,7 @@ class AppRunner {
late TimerRunner _timerRunner;
/// Метод для запуска приложения
Future<void> run() async {
Future<void> run(List<String> arguments) async {
try {
WidgetsFlutterBinding.ensureInitialized();
// Инициализация сервиса отладки
@@ -62,38 +56,28 @@ class AppRunner {
// Инициализация приложения
await _initApp();
final diContainer = await _initDependencies(
debugService: _debugService,
env: env,
timerRunner: _timerRunner,
);
// Инициализация метода обработки ошибок
_initErrorHandlers(_debugService);
// throw Exception('Test error');
runApp(
App(
initDependencies: () {
return _initDependencies(
debugService: _debugService,
env: env,
timerRunner: _timerRunner,
).timeout(
_initTimeout,
onTimeout: () {
return Future.error(
TimeoutException(
'Превышено время ожидания инициализации зависимостей',
),
);
},
);
},
),
);
runApp(AppRoot(diContainer: diContainer, router: router));
await _onAppLoaded();
} on Object catch (e, stackTrace) {
await _onAppLoaded();
_timerRunner.stop();
/// Если произошла ошибка при инициализации приложения,
/// то запускаем экран ошибки
runApp(ErrorScreen(error: e, stackTrace: stackTrace, onRetry: run));
runApp(
ErrorScreen(
error: e,
stackTrace: stackTrace,
onRetry: () => run(arguments),
),
);
}
}
@@ -123,20 +107,32 @@ class AppRunner {
}) async {
debugService.log(() => 'Тип сборки: ${env.name}');
final diContainer = DiContainer(env: env, dService: debugService);
await diContainer.init(
onProgress: (name) => timerRunner.logOnProgress(name),
onComplete: (name) {
timerRunner
..logOnComplete(name)
..stop();
},
onError: (message, error, [stackTrace]) {
timerRunner.stop();
_debugService.logError(message, error: error, stackTrace: stackTrace);
throw Exception('Ошибка инициализации зависимостей: $message');
},
);
//throw Exception('Test error');
await diContainer
.init(
onProgress: (name) => timerRunner.logOnProgress(name),
onComplete: (name) {
timerRunner
..logOnComplete(name)
..stop();
},
onError: (message, error, [stackTrace]) {
timerRunner.stop();
_debugService.logError(
message,
error: error,
stackTrace: stackTrace,
);
throw Exception('Ошибка инициализации зависимостей: $message');
},
)
.timeout(
const Duration(seconds: 7),
onTimeout: () {
throw Exception(
'Превышено время ожидания инициализации зависимостей',
);
},
);
return diContainer;
}
}