refactor(app): обновить структуру приложения и удалить устаревшие провайдеры (#44)

* refactor(app): обновить структуру приложения и удалить устаревшие провайдеры
* refactor(runner): упростить обработку ошибок и улучшить логирование времени инициализации
* refactor(runner): улучшить порядок инициализации приложения и обработку ошибок
* refactor(app): исправить контекст MediaQuery для предотвращения перерисовки
* refactor(pp): удалить главный виджет приложения и заменить его на AppRoot
* docs(copilot-instructions): уточнить правила проведения Code Review на русском языке
* refactor(linter): добавить правило avoid_catches_without_on_clauses для улучшения обработки исключений

---------

Co-authored-by: petrovyuri <petrovyuri@example.com>
This commit is contained in:
Yuri Petrov
2025-12-11 21:18:24 +03:00
committed by GitHub
parent 84f7fa8889
commit 6500b917c5
18 changed files with 137 additions and 299 deletions

View File

@@ -4,8 +4,8 @@ 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';
@@ -16,11 +16,6 @@ import 'package:go_router/go_router.dart';
part 'errors_handlers.dart';
/// Время ожидания инициализации зависимостей
/// Если время превышено, то будет показан экран ошибки
/// В дальнейшем нужно убрать в env
const _initTimeout = Duration(seconds: 7);
/// Класс, реализующий раннер для конфигурирования приложения при запуске
///
/// Порядок инициализации:
@@ -48,7 +43,7 @@ class AppRunner {
late TimerRunner _timerRunner;
/// Метод для запуска приложения
Future<void> run() async {
Future<void> run(List<String> arguments) async {
try {
WidgetsFlutterBinding.ensureInitialized();
// Инициализация сервиса отладки
@@ -62,42 +57,31 @@ class AppRunner {
// Инициализация приложения
await _initApp();
// Инициализация метода обработки ошибок
_initErrorHandlers(_debugService);
// Инициализация роутера
router = AppRouter.createRouter(_debugService);
// throw Exception('Test error');
runApp(
App(
router: router,
initDependencies: () {
return _initDependencies(
debugService: _debugService,
env: env,
timerRunner: _timerRunner,
).timeout(
_initTimeout,
onTimeout: () {
return Future.error(
TimeoutException(
'Превышено время ожидания инициализации зависимостей',
),
);
},
);
},
),
final diContainer = await _initDependencies(
debugService: _debugService,
env: env,
timerRunner: _timerRunner,
);
// Инициализация метода обработки ошибок
_initErrorHandlers(_debugService);
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),
),
);
}
}
@@ -127,20 +111,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;
}
}