mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2026-02-05 11:42:17 +00:00
feat(debug): Удалить Talker (#2)
Co-authored-by: petrovyuri <y.petrov@friflex.com>
This commit is contained in:
@@ -1,6 +1,5 @@
|
||||
import 'package:dio/dio.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/i_http_client.dart';
|
||||
import 'package:friflex_starter/features/debug/i_debug_service.dart';
|
||||
|
||||
@@ -26,14 +25,7 @@ final class AppHttpClient implements IHttpClient {
|
||||
..headers = {
|
||||
'Content-Type': 'application/json',
|
||||
};
|
||||
|
||||
// Добавление интерцептора для логирования запросов
|
||||
if (appConfig.env != AppEnv.prod) {
|
||||
final interceptor = debugService.createHttpInterceptor();
|
||||
if (interceptor is Interceptor) {
|
||||
_httpClient.interceptors.add(interceptor);
|
||||
}
|
||||
}
|
||||
debugService.log('HTTP client created');
|
||||
}
|
||||
|
||||
/// Конфигурация приложения
|
||||
|
||||
@@ -15,8 +15,7 @@ import 'package:i_app_services/i_app_services.dart';
|
||||
/// {@endtemplate}
|
||||
final class DiContainer {
|
||||
/// {@macro dependencies_container}
|
||||
DiContainer({required this.env, required IDebugService dService})
|
||||
: debugService = dService;
|
||||
DiContainer({required this.env, required IDebugService dService}) : debugService = dService;
|
||||
final AppEnv env;
|
||||
|
||||
/// Сервис для отладки, получаем из конструктора
|
||||
@@ -84,8 +83,8 @@ final class DiContainer {
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${IPathProvider.name}',
|
||||
error: error,
|
||||
stackTrace: stackTrace,
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -95,8 +94,8 @@ final class DiContainer {
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации ${ISecureStorage.name}',
|
||||
error: error,
|
||||
stackTrace: stackTrace,
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,8 +60,8 @@ final class DiRepositories {
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации репозитория $IAuthRepository',
|
||||
error: error,
|
||||
stackTrace: stackTrace,
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -79,8 +79,8 @@ final class DiRepositories {
|
||||
} on Object catch (error, stackTrace) {
|
||||
onError(
|
||||
'Ошибка инициализации репозитория $IMainRepository',
|
||||
error: error,
|
||||
stackTrace: stackTrace,
|
||||
error,
|
||||
stackTrace,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -105,9 +105,8 @@ final class DiRepositories {
|
||||
final repo = switch (environment) {
|
||||
AppEnv.dev => mockFactory(),
|
||||
AppEnv.prod => mainFactory(),
|
||||
AppEnv.stage => _mockReposToSwitch.contains(mockFactory().name)
|
||||
? mockFactory()
|
||||
: mainFactory(),
|
||||
AppEnv.stage =>
|
||||
_mockReposToSwitch.contains(mockFactory().name) ? mockFactory() : mainFactory(),
|
||||
};
|
||||
onProgress(repo.name);
|
||||
return repo;
|
||||
|
||||
@@ -1,9 +1,9 @@
|
||||
/// Обратный вызов при ошибки инициализации
|
||||
typedef OnError = void Function(
|
||||
String message, {
|
||||
Object? error,
|
||||
String message,
|
||||
Object error, [
|
||||
StackTrace? stackTrace,
|
||||
});
|
||||
]);
|
||||
|
||||
/// Обратный вызов при прогрессе
|
||||
typedef OnProgress = void Function(String name);
|
||||
|
||||
@@ -1,60 +0,0 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:friflex_starter/features/debug/i_debug_service.dart';
|
||||
import 'package:talker_bloc_logger/talker_bloc_logger.dart';
|
||||
import 'package:talker_dio_logger/talker_dio_logger_interceptor.dart';
|
||||
import 'package:talker_flutter/talker_flutter.dart';
|
||||
|
||||
/// Класс реализации интерфейса дебаг сервиса
|
||||
class AppDebugService implements IDebugService {
|
||||
/// Наименование сервиса
|
||||
static const name = 'GmsDebugService';
|
||||
|
||||
final Talker _talker = TalkerFlutter.init();
|
||||
|
||||
@override
|
||||
TalkerBlocObserver createBlocObserver() =>
|
||||
TalkerBlocObserver(talker: _talker);
|
||||
|
||||
@override
|
||||
TalkerDioLogger createHttpInterceptor() => TalkerDioLogger(talker: _talker);
|
||||
|
||||
@override
|
||||
TalkerRouteObserver createRouterObserver() => TalkerRouteObserver(_talker);
|
||||
|
||||
@override
|
||||
void error(String msg, [Object? exception, StackTrace? stackTrace]) {
|
||||
_talker.error(msg, exception, stackTrace);
|
||||
}
|
||||
|
||||
@override
|
||||
void handleError(Object error, [StackTrace? stackTrace, String? message]) {
|
||||
_talker.handle(error, stackTrace, message);
|
||||
}
|
||||
|
||||
@override
|
||||
void info(String message) {
|
||||
_talker.info(message);
|
||||
}
|
||||
|
||||
@override
|
||||
void log(String message) {
|
||||
_talker.log(message);
|
||||
}
|
||||
|
||||
@override
|
||||
void warning(String message) {
|
||||
_talker.warning(message);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<T?> openDebugScreen<T>(
|
||||
BuildContext context, {
|
||||
bool useRootNavigator = false,
|
||||
}) {
|
||||
return Navigator.of(context).push<T>(
|
||||
MaterialPageRoute(
|
||||
builder: (context) => TalkerScreen(talker: _talker),
|
||||
),
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -31,7 +31,7 @@ class DebugScreen extends StatelessWidget {
|
||||
onPressed: () async {
|
||||
await context.di.debugService.openDebugScreen(context);
|
||||
},
|
||||
child: const Text('Вызывать Talker'),
|
||||
child: const Text('Вызывать Экран отладки'),
|
||||
),
|
||||
],
|
||||
),
|
||||
|
||||
66
lib/features/debug/debug_service.dart
Normal file
66
lib/features/debug/debug_service.dart
Normal file
@@ -0,0 +1,66 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:friflex_starter/features/debug/i_debug_service.dart';
|
||||
|
||||
/// Класс реализации интерфейса Debug сервиса
|
||||
class DebugService implements IDebugService {
|
||||
/// Наименование сервиса
|
||||
static const name = 'DebugService';
|
||||
|
||||
@override
|
||||
void logDebug(Object message, {Object? logLevel, Map<String, dynamic>? args}) {
|
||||
if (kDebugMode) {
|
||||
print('Message: $message');
|
||||
}
|
||||
|
||||
/// Реализация логики
|
||||
}
|
||||
|
||||
@override
|
||||
void logError(
|
||||
Object message, {
|
||||
Object? error,
|
||||
Object? logLevel,
|
||||
Map<String, dynamic>? args,
|
||||
StackTrace? stackTrace,
|
||||
}) {
|
||||
final logMessage = message is Function ? Function.apply(message, []) as Object : message;
|
||||
if (kDebugMode) {
|
||||
print('Message: $logMessage');
|
||||
print('Error: $error');
|
||||
print('StackTrace: $stackTrace');
|
||||
}
|
||||
|
||||
/// Реализация логики
|
||||
}
|
||||
|
||||
@override
|
||||
void log(Object message, {Object? logLevel, Map<String, dynamic>? args}) {
|
||||
final logMessage = message is Function ? Function.apply(message, []) as Object : message;
|
||||
if (kDebugMode) {
|
||||
print('Message: $logMessage');
|
||||
}
|
||||
|
||||
/// Реализация логики
|
||||
}
|
||||
|
||||
@override
|
||||
void logWarning(Object message, {Object? logLevel, Map<String, dynamic>? args}) {
|
||||
final logMessage = message is Function ? Function.apply(message, []) as Object : message;
|
||||
if (kDebugMode) {
|
||||
print('Message: $logMessage');
|
||||
}
|
||||
|
||||
/// Реализация логики
|
||||
}
|
||||
|
||||
@override
|
||||
Future<T?> openDebugScreen<T>(BuildContext context, {bool useRootNavigator = false}) {
|
||||
if (kDebugMode) {
|
||||
print('Переход на страницу отладки');
|
||||
}
|
||||
|
||||
/// Реализация логики
|
||||
return Future.value();
|
||||
}
|
||||
}
|
||||
@@ -2,51 +2,37 @@ import 'package:flutter/material.dart';
|
||||
|
||||
/// Интерфейс для сервиса отладки
|
||||
abstract interface class IDebugService {
|
||||
/// Наименование сервиса
|
||||
static const name = 'IDebugService';
|
||||
|
||||
/// Метод для создания обработчика для BLoC
|
||||
Object createBlocObserver();
|
||||
/// Метод для логирования сообщений
|
||||
void log(
|
||||
Object message, {
|
||||
Object logLevel,
|
||||
Map<String, dynamic>? args,
|
||||
});
|
||||
|
||||
/// Метод для создания обработчика для роутера
|
||||
NavigatorObserver createRouterObserver();
|
||||
/// Метод для логирования предупреждений
|
||||
void logWarning(
|
||||
Object message, {
|
||||
Object logLevel,
|
||||
Map<String, dynamic>? args,
|
||||
});
|
||||
|
||||
/// Метод для создания обработчика для http-клиентов
|
||||
Object createHttpInterceptor();
|
||||
|
||||
/// Метод для логгирования предупреждений
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [message] - сообщение для логгирования в формате [String]
|
||||
void warning(String message);
|
||||
|
||||
/// Метод для логгирования ошибок
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [message] - сообщение для логгирования в формате [String]
|
||||
/// - [exception] - исключение
|
||||
/// - [stackTrace] - стек вызова
|
||||
void error(String message, [Object? exception, StackTrace? stackTrace]);
|
||||
/// Метод для логирования ошибок
|
||||
void logError(
|
||||
Object message, {
|
||||
Object error,
|
||||
StackTrace? stackTrace,
|
||||
Object logLevel,
|
||||
Map<String, dynamic>? args,
|
||||
});
|
||||
|
||||
/// Метод для обработки ошибок
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [error] - исключение
|
||||
/// - [stackTrace] - стек вызова
|
||||
/// - [message] - сообщение для логгирования в формате [String]
|
||||
void handleError(Object error, [StackTrace? stackTrace, String? message]);
|
||||
|
||||
/// Метод для логгирования информативных сообщений
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [message] - сообщение для логгирования в формате [String]
|
||||
void info(String message);
|
||||
|
||||
/// Метод для логгирования сообщений
|
||||
///
|
||||
/// Принимает:
|
||||
/// - [message] - сообщение для логгирования в формате [String]
|
||||
void log(String message);
|
||||
void logDebug(
|
||||
Object message, {
|
||||
Object logLevel,
|
||||
Map<String, dynamic>? args,
|
||||
});
|
||||
|
||||
/// Метод для открытия окна отладки
|
||||
///
|
||||
|
||||
@@ -9,7 +9,7 @@ import 'package:go_router/go_router.dart';
|
||||
class AppRouter {
|
||||
/// Конструктор для инициализации роутера
|
||||
const AppRouter();
|
||||
|
||||
|
||||
/// Ключ для доступа к корневому навигатору приложения
|
||||
static final rootNavigatorKey = GlobalKey<NavigatorState>();
|
||||
|
||||
@@ -22,9 +22,6 @@ class AppRouter {
|
||||
navigatorKey: rootNavigatorKey,
|
||||
debugLogDiagnostics: true,
|
||||
initialLocation: initialLocation,
|
||||
observers: [
|
||||
debugService.createRouterObserver(),
|
||||
],
|
||||
routes: [
|
||||
StatefulShellRoute.indexedStack(
|
||||
parentNavigatorKey: rootNavigatorKey,
|
||||
|
||||
@@ -6,7 +6,7 @@ import 'package:flutter/services.dart';
|
||||
import 'package:friflex_starter/app/app.dart';
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/di/di_container.dart';
|
||||
import 'package:friflex_starter/features/debug/app_debug_service.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';
|
||||
@@ -45,8 +45,8 @@ class AppRunner {
|
||||
Future<void> run() async {
|
||||
WidgetsFlutterBinding.ensureInitialized();
|
||||
// Инициализация сервиса отладки
|
||||
_debugService = AppDebugService();
|
||||
|
||||
_debugService = DebugService();
|
||||
|
||||
_timerRunner = TimerRunner(_debugService);
|
||||
|
||||
// Инициализация приложения
|
||||
@@ -91,7 +91,7 @@ class AppRunner {
|
||||
|
||||
/// Метод для инициализации зависимостей приложения
|
||||
Future<DiContainer> _initDependencies(IDebugService debugService) async {
|
||||
debugService.log('Тип сборки: ${env.name}');
|
||||
debugService.log(() => 'Тип сборки: ${env.name}');
|
||||
final diContainer = DiContainer(
|
||||
env: env,
|
||||
dService: debugService,
|
||||
|
||||
@@ -5,16 +5,24 @@ void _initErrorHandlers(IDebugService debugService) {
|
||||
// Обработка ошибок в приложении
|
||||
FlutterError.onError = (details) {
|
||||
_showErrorScreen();
|
||||
debugService.handleError(details.exception, details.stack,
|
||||
'FlutterError.onError: ${details.exceptionAsString()}',);
|
||||
debugService.logError(
|
||||
() => 'FlutterError.onError: ${details.exceptionAsString()}',
|
||||
error: details.exception,
|
||||
stackTrace: details.stack,
|
||||
);
|
||||
};
|
||||
// Обработка асинхронных ошибок в приложении
|
||||
PlatformDispatcher.instance.onError = (error, stack) {
|
||||
_showErrorScreen();
|
||||
debugService.handleError(error, stack, 'PlatformDispatcher: $error');
|
||||
debugService.logError(
|
||||
() => 'PlatformDispatcher.instance.onError',
|
||||
error: error,
|
||||
stackTrace: stack,
|
||||
);
|
||||
return true;
|
||||
};
|
||||
}
|
||||
|
||||
/// Метод для показа экрана ошибки
|
||||
void _showErrorScreen() {
|
||||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||
|
||||
@@ -40,10 +40,10 @@ class TimerRunner {
|
||||
|
||||
/// Метод для обработки прогресса инициализации зависимостей
|
||||
void logOnError(
|
||||
String message, {
|
||||
Object? error,
|
||||
String message,
|
||||
Object error, [
|
||||
StackTrace? stackTrace,
|
||||
}) {
|
||||
_debugService.error(message, error, stackTrace);
|
||||
]) {
|
||||
_debugService.logError(() => message, error: error, stackTrace: stackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user