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;
}
}

View File

@@ -4,7 +4,6 @@ part of 'app_runner.dart';
void _initErrorHandlers(IDebugService debugService) {
// Обработка ошибок в приложении
FlutterError.onError = (details) {
_showErrorScreen(details.exception, details.stack);
debugService.logError(
() => 'FlutterError.onError: ${details.exceptionAsString()}',
error: details.exception,
@@ -13,7 +12,6 @@ void _initErrorHandlers(IDebugService debugService) {
};
// Обработка асинхронных ошибок в приложении
PlatformDispatcher.instance.onError = (error, stack) {
_showErrorScreen(error, stack);
debugService.logError(
() => 'PlatformDispatcher.instance.onError',
error: error,
@@ -22,14 +20,3 @@ void _initErrorHandlers(IDebugService debugService) {
return true;
};
}
/// Метод для показа экрана ошибки
void _showErrorScreen(Object error, StackTrace? stackTrace) {
WidgetsBinding.instance.addPostFrameCallback((_) async {
await AppRouter.rootNavigatorKey.currentState?.push(
MaterialPageRoute(
builder: (_) => ErrorScreen(error: error, stackTrace: stackTrace),
),
);
});
}

View File

@@ -24,6 +24,11 @@ class TimerRunner {
);
}
/// Метод для сброса секундомера
void reset() {
_stopwatch.reset();
}
/// Метод для обработки прогресса инициализации зависимостей
void logOnProgress(String name) {
_debugService.log(