Пачка экранов и логики #3

Merged
Dimkov966 merged 8 commits from feature/collection into develop 2025-04-02 20:13:12 +00:00
23 changed files with 1586 additions and 114 deletions
Showing only changes of commit b1aefa9f11 - Show all commits

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -6,6 +6,10 @@ analyzer
3.3 3.3
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/analyzer-7.3.0/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/analyzer-7.3.0/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/analyzer-7.3.0/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/analyzer-7.3.0/lib/
ansicolor
3.0
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/ansicolor-2.0.3/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/ansicolor-2.0.3/lib/
archive archive
3.0 3.0
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/archive-4.0.4/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/archive-4.0.4/
@@ -126,10 +130,6 @@ cupertino_icons
3.1 3.1
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/cupertino_icons-1.0.8/lib/
curl_logger_dio_interceptor
2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/curl_logger_dio_interceptor-1.0.0/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/curl_logger_dio_interceptor-1.0.0/lib/
dart_style dart_style
3.4 3.4
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/dart_style-3.0.1/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/dart_style-3.0.1/
@@ -294,6 +294,10 @@ graphs
3.4 3.4
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/graphs-2.3.2/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/graphs-2.3.2/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/graphs-2.3.2/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/graphs-2.3.2/lib/
group_button
2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/group_button-5.3.4/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/group_button-5.3.4/lib/
hashcodes hashcodes
2.12 2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/hashcodes-2.0.0/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/hashcodes-2.0.0/
@@ -478,10 +482,6 @@ posix
3.0 3.0
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/posix-6.0.1/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/posix-6.0.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/posix-6.0.1/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/posix-6.0.1/lib/
pretty_dio_logger
3.0
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/pretty_dio_logger-1.4.0/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/pretty_dio_logger-1.4.0/lib/
provider provider
2.12 2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/provider-6.1.2/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/provider-6.1.2/
@@ -502,10 +502,6 @@ recase
2.12 2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/recase-4.1.0/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/recase-4.1.0/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/recase-4.1.0/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/recase-4.1.0/lib/
settings_ui
2.12
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/settings_ui-2.0.2/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/settings_ui-2.0.2/lib/
share_plus share_plus
3.4 3.4
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/share_plus-10.1.4/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/share_plus-10.1.4/
@@ -594,6 +590,26 @@ string_scanner
3.1 3.1
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/string_scanner-1.4.1/lib/
talker
2.17
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker-4.7.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker-4.7.1/lib/
talker_bloc_logger
2.15
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_bloc_logger-4.7.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_bloc_logger-4.7.1/lib/
talker_dio_logger
2.15
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_dio_logger-4.7.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_dio_logger-4.7.1/lib/
talker_flutter
3.6
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_flutter-4.7.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_flutter-4.7.1/lib/
talker_logger
2.15
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_logger-4.7.1/
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/talker_logger-4.7.1/lib/
term_glyph term_glyph
3.1 3.1
file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/ file:///Users/vitalijnecitajlo/.pub-cache/hosted/pub.dev/term_glyph-1.2.2/

File diff suppressed because one or more lines are too long

View File

@@ -18,6 +18,7 @@ import 'package:remever/components/notifiers/app_settings.dart';
import 'package:remever/components/listeners/theme_listener.dart'; import 'package:remever/components/listeners/theme_listener.dart';
import 'package:remever/i18n/strings.g.dart'; import 'package:remever/i18n/strings.g.dart';
import 'package:remever/theme/custom_theme.dart'; import 'package:remever/theme/custom_theme.dart';
import 'package:talker_flutter/talker_flutter.dart';
final Completer<GlobalKey<NavigatorState>> navKeyCompleter = final Completer<GlobalKey<NavigatorState>> navKeyCompleter =
Completer<GlobalKey<NavigatorState>>(); Completer<GlobalKey<NavigatorState>>();
@@ -142,13 +143,13 @@ class _MyAppState extends State<MyApp>
locale: TranslationProvider.of(context).flutterLocale, locale: TranslationProvider.of(context).flutterLocale,
supportedLocales: AppLocaleUtils.supportedLocales, supportedLocales: AppLocaleUtils.supportedLocales,
localizationsDelegates: GlobalMaterialLocalizations.delegates, localizationsDelegates: GlobalMaterialLocalizations.delegates,
routerConfig: globalRouter.config(),
routerConfig: globalRouter.config(
navigatorObservers:
() => <NavigatorObserver>[TalkerRouteObserver(talker)],
),
builder: (BuildContext context, Widget? child) { builder: (BuildContext context, Widget? child) {
return MediaQuery( return ChangeNotifierProvider<AppSettingsNotifier>(
data: MediaQuery.of(
context,
).copyWith(textScaler: TextScaler.noScaling),
child: ChangeNotifierProvider<AppSettingsNotifier>(
create: (_) => settingsNotifier, create: (_) => settingsNotifier,
builder: (BuildContext context, Widget? nchild) { builder: (BuildContext context, Widget? nchild) {
if (nchild != null) return nchild; if (nchild != null) return nchild;
@@ -177,7 +178,6 @@ class _MyAppState extends State<MyApp>
}, },
); );
}, },
),
); );
}, },
); );

View File

@@ -8,6 +8,8 @@ import 'package:modal_bottom_sheet/modal_bottom_sheet.dart';
import 'package:remever/common/resources.dart'; import 'package:remever/common/resources.dart';
import 'package:remever/components/extensions/context.dart'; import 'package:remever/components/extensions/context.dart';
import 'package:remever/router.dart'; import 'package:remever/router.dart';
import 'package:remever/services/logs/logs_service.dart';
import 'package:talker/talker.dart';
import 'events/events.dart'; import 'events/events.dart';
/// ///
@@ -17,6 +19,17 @@ AppRouter get globalRouter {
return GetIt.I.get<AppRouter>(); return GetIt.I.get<AppRouter>();
} }
///
/// Логирование
///
LogsService get logger {
return GetIt.I.get<LogsService>();
}
Talker get talker {
return GetIt.I.get<Talker>();
}
/// ///
/// Показ тоста /// Показ тоста
/// ///

View File

@@ -1,8 +1,9 @@
// Package imports: // Package imports:
import 'package:curl_logger_dio_interceptor/curl_logger_dio_interceptor.dart';
import 'package:dio/dio.dart'; import 'package:dio/dio.dart';
import 'package:dio_smart_retry/dio_smart_retry.dart'; import 'package:dio_smart_retry/dio_smart_retry.dart';
import 'package:pretty_dio_logger/pretty_dio_logger.dart'; import 'package:remever/common/functions.dart';
import 'package:talker_dio_logger/talker_dio_logger_interceptor.dart';
import 'package:talker_dio_logger/talker_dio_logger_settings.dart';
// Project imports: // Project imports:
import '../../components/env.dart'; import '../../components/env.dart';
@@ -62,15 +63,11 @@ Dio get apiClient {
..add(_auth) ..add(_auth)
..add(_error) ..add(_error)
..add( ..add(
PrettyDioLogger( TalkerDioLogger(
request: true, talker: talker,
requestBody: true, settings: const TalkerDioLoggerSettings(printRequestHeaders: true),
requestHeader: true,
responseBody: true,
error: true,
), ),
) )
..add(CurlLoggerDioInterceptor())
..add( ..add(
RetryInterceptor( RetryInterceptor(
dio: client, dio: client,

View File

@@ -1,5 +1,6 @@
// Package imports: // Package imports:
import 'package:drift/drift.dart'; import 'package:drift/drift.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/database/database.dart'; import 'package:remever/database/database.dart';
import 'package:remever/database/tables.dart'; import 'package:remever/database/tables.dart';
import 'package:remever/models/collection_dto.dart'; import 'package:remever/models/collection_dto.dart';
@@ -16,11 +17,18 @@ class CollectionsDao extends DatabaseAccessor<AppDatabase>
/// Получение коллекций из базы данных /// Получение коллекций из базы данных
Stream<List<Collection>> getCollections() { Stream<List<Collection>> getCollections() {
try {
return db.managers.collections.watch(); return db.managers.collections.watch();
} catch (e, st) {
logger.logError('Ошибка в методе getCollections', e, st);
throw ('EXEPTION');
}
} }
/// Создание коллекции /// Создание коллекции
Future<void> createCollection(CollectionDto dto) async { Future<void> createCollection(CollectionDto dto) async {
try {
await db.managers.collections.create( await db.managers.collections.create(
(o) => o( (o) => o(
title: dto.title, title: dto.title,
@@ -29,10 +37,14 @@ class CollectionsDao extends DatabaseAccessor<AppDatabase>
image: Value<String?>(dto.avatar), image: Value<String?>(dto.avatar),
), ),
); );
} catch (e, st) {
logger.logError('Ошибка в методе createCollection', e, st);
}
} }
/// Обновление коллекции /// Обновление коллекции
Future<void> updateCollection(CollectionDto dto, String id) async { Future<void> updateCollection(CollectionDto dto, String id) async {
try {
await db.managers.collections await db.managers.collections
.filter((f) => f.id(id)) .filter((f) => f.id(id))
.update( .update(
@@ -43,10 +55,17 @@ class CollectionsDao extends DatabaseAccessor<AppDatabase>
image: Value<String?>(dto.avatar), image: Value<String?>(dto.avatar),
), ),
); );
} catch (e, st) {
logger.logError('Ошибка в методе updateCollection', e, st);
}
} }
/// Удаление коллекции /// Удаление коллекции
Future<void> deleteCollection(String id) async { Future<void> deleteCollection(String id) async {
try {
await db.managers.collections.filter((f) => f.id(id)).delete(); await db.managers.collections.filter((f) => f.id(id)).delete();
} catch (e, st) {
logger.logError('Ошибка в методе deleteCollection', e, st);
}
} }
} }

View File

@@ -6,7 +6,7 @@
/// Locales: 2 /// Locales: 2
/// Strings: 20 (10 per locale) /// Strings: 20 (10 per locale)
/// ///
/// Built on 2025-03-25 at 18:21 UTC /// Built on 2025-04-01 at 17:23 UTC
// coverage:ignore-file // coverage:ignore-file
// ignore_for_file: type=lint, unused_import // ignore_for_file: type=lint, unused_import

View File

@@ -20,6 +20,7 @@ import 'services/collection/collections_service.dart' as _i1001;
import 'services/core/enc_keys_service.dart' as _i439; import 'services/core/enc_keys_service.dart' as _i439;
import 'services/core/lang_service.dart' as _i68; import 'services/core/lang_service.dart' as _i68;
import 'services/core/theme_service.dart' as _i84; import 'services/core/theme_service.dart' as _i84;
import 'services/logs/logs_service.dart' as _i393;
import 'services/warmup_service.dart' as _i564; import 'services/warmup_service.dart' as _i564;
extension GetItInjectableX on _i174.GetIt { extension GetItInjectableX on _i174.GetIt {
@@ -33,6 +34,7 @@ extension GetItInjectableX on _i174.GetIt {
gh.factory<_i439.EncKeysService>(() => _i439.EncKeysService()); gh.factory<_i439.EncKeysService>(() => _i439.EncKeysService());
gh.factory<_i84.ThemeService>(() => _i84.ThemeService()); gh.factory<_i84.ThemeService>(() => _i84.ThemeService());
gh.singleton<_i565.AppDatabase>(() => _i565.AppDatabase()); gh.singleton<_i565.AppDatabase>(() => _i565.AppDatabase());
gh.singleton<_i393.LogsService>(() => _i393.LogsService());
gh.singleton<_i764.CollectionsInterface>(() => _i1001.CollectionsService()); gh.singleton<_i764.CollectionsInterface>(() => _i1001.CollectionsService());
gh.singleton<_i580.AuthInterface>(() => _i975.AuthService()); gh.singleton<_i580.AuthInterface>(() => _i975.AuthService());
await gh.singletonAsync<_i564.WarmupService>(() { await gh.singletonAsync<_i564.WarmupService>(() {

View File

@@ -2,27 +2,36 @@ import 'dart:async';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart'; import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:hive_ce_flutter/hive_flutter.dart'; import 'package:hive_ce_flutter/hive_flutter.dart';
import 'package:remever/app.dart'; import 'package:remever/app.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/env.dart'; import 'package:remever/env.dart';
import 'package:remever/i18n/strings.g.dart'; import 'package:remever/i18n/strings.g.dart';
import 'package:remever/inject.dart'; import 'package:remever/inject.dart';
import 'package:remever/router.dart'; import 'package:remever/router.dart';
import 'package:remever/services/logs/custom_history.dart';
import 'package:remever/services/warmup_service.dart'; import 'package:remever/services/warmup_service.dart';
import 'package:talker/talker.dart';
import 'package:talker_bloc_logger/talker_bloc_logger_observer.dart';
import 'package:talker_bloc_logger/talker_bloc_logger_settings.dart';
void _onError(Object error, StackTrace trace) { void _onError(Object error, StackTrace trace) {
debugPrint('error ${error.toString()}'); debugPrint('error ${error.toString()}');
logger.logError('main _onError', error, trace);
} }
void _flutterError(FlutterErrorDetails details) { void _flutterError(FlutterErrorDetails details) {
debugPrint('error ${details.context}'); debugPrint('error ${details.context}');
logger.logError('main _flutterError', details.exception, details.stack);
} }
bool _platformDispatcher(Object exception, StackTrace stackTrace) { bool _platformDispatcher(Object exception, StackTrace stackTrace) {
if ('$exception'.toLowerCase().contains('dio')) return true; if ('$exception'.toLowerCase().contains('dio')) return true;
debugPrint('error ${exception.toString()}'); debugPrint('error ${exception.toString()}');
logger.logError('main _platformDispatcher', exception, stackTrace);
return true; return true;
} }
@@ -43,10 +52,26 @@ void main() {
FlutterError.onError = _flutterError; FlutterError.onError = _flutterError;
PlatformDispatcher.instance.onError = _platformDispatcher; PlatformDispatcher.instance.onError = _platformDispatcher;
final Talker talker = Talker(
history: CustomHistory(
TalkerSettings(),
history: await logger.getHistory(),
),
);
getIt.registerSingleton<AppRouter>(AppRouter()); getIt.registerSingleton<AppRouter>(AppRouter());
getIt.registerSingleton<Talker>(talker);
await getIt<WarmupService>().firstStart(); await getIt<WarmupService>().firstStart();
Bloc.observer = TalkerBlocObserver(
talker: talker,
settings: const TalkerBlocLoggerSettings(
printCreations: true,
printClosings: true,
),
);
runApp(TranslationProvider(child: const MyApp())); runApp(TranslationProvider(child: const MyApp()));
}, _onError); }, _onError);
} }

View File

@@ -0,0 +1,15 @@
// Package imports:
import 'package:talker/talker.dart';
class BuildLog extends TalkerLog {
BuildLog(String super.message);
@override
String get title => 'Build';
@override
String? get key => 'build_log_key';
@override
AnsiPen get pen => AnsiPen()..xterm(121);
}

View File

@@ -4,9 +4,12 @@ import 'package:drift_db_viewer/drift_db_viewer.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:get_it_mixin/get_it_mixin.dart'; import 'package:get_it_mixin/get_it_mixin.dart';
import 'package:package_info_plus/package_info_plus.dart'; import 'package:package_info_plus/package_info_plus.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/common/widgets/typography.dart'; import 'package:remever/common/widgets/typography.dart';
import 'package:remever/common/widgets/wspace.dart'; import 'package:remever/common/widgets/wspace.dart';
import 'package:remever/database/database.dart'; import 'package:remever/database/database.dart';
import 'package:remever/widgets/primary_button.dart';
import 'package:talker_flutter/talker_flutter.dart';
import '../../components/notifiers/app_settings.dart'; import '../../components/notifiers/app_settings.dart';
import '../../components/env.dart'; import '../../components/env.dart';
@@ -64,6 +67,17 @@ class _SandboxScreenState extends State<SandboxScreen> {
}, },
child: const Text('Open Db Viewer'), child: const Text('Open Db Viewer'),
), ),
PrimaryButton(
child: const Text('Логи'),
onTap: () {
Navigator.of(context).push(
MaterialPageRoute<dynamic>(
builder:
(BuildContext context) => TalkerScreen(talker: talker),
),
);
},
),
], ],
), ),
); );

View File

@@ -40,7 +40,9 @@ final class AuthService implements AuthInterface {
if (response['success'] == false) return null; if (response['success'] == false) return null;
return response['result']['authUid']; return response['result']['authUid'];
} catch (e) { } catch (e, st) {
logger.logError('Ошибка в методе login', e, st);
return null; return null;
} }
} }
@@ -66,10 +68,8 @@ final class AuthService implements AuthInterface {
} }
return success; return success;
} catch (e) { } catch (e, st) {
if (e is DioException) { logger.logError('Ошибка в методе send code', e, st);
showErrorToast(e.response?.data['message']);
}
return false; return false;
} }

View File

@@ -0,0 +1,87 @@
// Dart imports:
import 'dart:convert';
import 'dart:io';
// Flutter imports:
import 'package:flutter/widgets.dart';
// Package imports:
import 'package:path_provider/path_provider.dart';
import 'package:talker_flutter/talker_flutter.dart';
class CustomHistory implements TalkerHistory {
CustomHistory(this.settings, {List<TalkerData>? history}) {
if (history != null) {
_history.addAll(history);
}
}
final TalkerSettings settings;
final List<TalkerData> _history = <TalkerData>[];
@override
List<TalkerData> get history => _history;
@override
void clean() async {
if (settings.useHistory) {
_history.clear();
final Directory docDir = await getApplicationDocumentsDirectory();
final String path = '${docDir.path}/history.log';
final File logFile = File(path);
if (logFile.existsSync()) {
logFile.deleteSync();
}
}
}
@override
void write(TalkerData data) {
if (settings.useHistory && settings.enabled) {
if (settings.maxHistoryItems <= _history.length) {
_history.removeAt(0);
}
_history.add(data);
_writeToFile(data);
}
}
void _writeToFile(TalkerData data) async {
try {
final Directory docDir = await getApplicationDocumentsDirectory();
final String path = '${docDir.path}/history.log';
final File logFile = File(path);
if (!logFile.existsSync()) {
logFile.createSync();
}
final Map<String, dynamic> jData = <String, dynamic>{
'error': data.error,
'exception': data.exception,
'logLevel': data.logLevel,
'key': data.key,
'message': data.message,
'stackTrace': data.stackTrace,
'title': data.title,
'time': data.time.toString(),
};
logFile.writeAsStringSync(
'${jsonEncode(jData)}\n',
mode: FileMode.writeOnlyAppend,
);
} catch (e) {
debugPrint('ALARMA ERROR in _writeToFile customHistory $e');
}
}
}

View File

@@ -0,0 +1,123 @@
// Dart imports:
import 'dart:async';
import 'dart:convert';
import 'dart:io';
// Flutter imports:
import 'package:flutter/cupertino.dart';
// Package imports:
import 'package:fluttertoast/fluttertoast.dart';
import 'package:injectable/injectable.dart';
import 'package:path_provider/path_provider.dart';
import 'package:remever/common/functions.dart';
import 'package:remever/common/typedef.dart';
import 'package:remever/models/logs/build_log.dart';
import 'package:talker_flutter/talker_flutter.dart';
@Singleton()
class LogsService {
void log(String message) {
talker.log(message);
}
void logDebug(String message) {
talker.debug(message);
}
void logInfo(String message) {
talker.info(message);
}
void logError(String message, Object? exception, StackTrace? stackTrace) {
talker.error(message, exception, stackTrace);
showErrorToast('$message ${exception.toString()}');
}
void logCritical(String message, Object? exception, StackTrace? stackTrace) {
talker.critical(message, exception, stackTrace);
}
void logBuild(String message) {
talker.logCustom(BuildLog(message));
}
// Метод для получения истории
Future<List<TalkerData>?> getHistory() async {
try {
final Directory docDir = await getApplicationDocumentsDirectory();
final String path = '${docDir.path}/history.log';
final File logFile = File(path);
if (!logFile.existsSync()) {
return null;
}
final List<String> lines = await logFile.readAsLines();
if (lines.length > 1500) {
lines.removeRange(0, lines.length - 1500);
logFile.deleteSync();
logFile.createSync();
logFile.writeAsStringSync(lines.join('\n'));
}
final List<Json> entities = await _parseLines(lines, logFile);
if (entities.isEmpty) {
return null;
}
final List<TalkerData> talkerData = _convertEntitiesToTalkerData(
entities,
);
return talkerData;
} catch (e) {
debugPrint('ALARM ERROR IN GETHISTORY $e');
return null;
}
}
// Парсинг строк из файла
Future<List<Json>> _parseLines(List<String> lines, File logFile) async {
final List<Json> entities = <Json>[];
for (String line in lines) {
try {
entities.add(jsonDecode(line));
} catch (e) {
debugPrint('Error $e in line $line of ${logFile.path}');
if (e.toString().contains('Unexpected character')) {
unawaited(logFile.delete());
break;
}
}
}
return entities;
}
// Преобразование JSON-сущностей в TalkerData
List<TalkerData> _convertEntitiesToTalkerData(List<Json> entities) {
final List<TalkerData> talkerData = <TalkerData>[];
for (Json json in entities) {
talkerData.add(
TalkerData(
json['message'],
error: json['error'],
exception: json['exception'],
key: json['key'],
logLevel: json['logLevel'],
stackTrace: json['stackTrace'],
time: DateTime.tryParse(json['time']),
title: 'SAVED ${json['title']}',
),
);
}
return talkerData;
}
}

View File

@@ -17,6 +17,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "7.3.0" version: "7.3.0"
ansicolor:
dependency: transitive
description:
name: ansicolor
sha256: "50e982d500bc863e1d703448afdbf9e5a72eb48840a4f766fa361ffd6877055f"
url: "https://pub.dev"
source: hosted
version: "2.0.3"
archive: archive:
dependency: transitive dependency: transitive
description: description:
@@ -257,14 +265,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.0.8" version: "1.0.8"
curl_logger_dio_interceptor:
dependency: "direct main"
description:
name: curl_logger_dio_interceptor
sha256: f20d89187a321d2150e1412bca30ebf4d89130bafc648ce21bd4f1ef4062b214
url: "https://pub.dev"
source: hosted
version: "1.0.0"
dart_style: dart_style:
dependency: transitive dependency: transitive
description: description:
@@ -613,6 +613,14 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "2.3.2" version: "2.3.2"
group_button:
dependency: transitive
description:
name: group_button
sha256: "0610fcf28ed122bfb4b410fce161a390f7f2531d55d1d65c5375982001415940"
url: "https://pub.dev"
source: hosted
version: "5.3.4"
hashcodes: hashcodes:
dependency: transitive dependency: transitive
description: description:
@@ -981,14 +989,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "6.0.1" version: "6.0.1"
pretty_dio_logger:
dependency: "direct main"
description:
name: pretty_dio_logger
sha256: "36f2101299786d567869493e2f5731de61ce130faa14679473b26905a92b6407"
url: "https://pub.dev"
source: hosted
version: "1.4.0"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1029,14 +1029,6 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "4.1.0" version: "4.1.0"
settings_ui:
dependency: "direct main"
description:
name: settings_ui
sha256: d9838037cb554b24b4218b2d07666fbada3478882edefae375ee892b6c820ef3
url: "https://pub.dev"
source: hosted
version: "2.0.2"
share_plus: share_plus:
dependency: "direct main" dependency: "direct main"
description: description:
@@ -1218,6 +1210,46 @@ packages:
url: "https://pub.dev" url: "https://pub.dev"
source: hosted source: hosted
version: "1.4.1" version: "1.4.1"
talker:
dependency: "direct main"
description:
name: talker
sha256: "45abef5b92f9b9bd42c3f20133ad4b20ab12e1da2aa206fc0a40ea874bed7c5d"
url: "https://pub.dev"
source: hosted
version: "4.7.1"
talker_bloc_logger:
dependency: "direct main"
description:
name: talker_bloc_logger
sha256: "2214a5f6ef9ff33494dc6149321c270356962725cc8fc1a485d44b1d9b812ddd"
url: "https://pub.dev"
source: hosted
version: "4.7.1"
talker_dio_logger:
dependency: "direct main"
description:
name: talker_dio_logger
sha256: "52c1b554cccedec6073637a6d4f6a3e267dd4451c1545fe57e1b26897a560ccb"
url: "https://pub.dev"
source: hosted
version: "4.7.1"
talker_flutter:
dependency: "direct main"
description:
name: talker_flutter
sha256: "77458ca11638dfefb651e898a26101ee54e60dc0b168ad7481a05b1c97ce2680"
url: "https://pub.dev"
source: hosted
version: "4.7.1"
talker_logger:
dependency: "direct main"
description:
name: talker_logger
sha256: ed9b20b8c09efff9f6b7c63fc6630ee2f84aa92661ae09e5ba04e77272bf2ad2
url: "https://pub.dev"
source: hosted
version: "4.7.1"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:

View File

@@ -30,7 +30,6 @@ dependencies:
google_fonts: ^6.2.1 google_fonts: ^6.2.1
event_bus: ^2.0.1 event_bus: ^2.0.1
auto_route: ^10.0.0 auto_route: ^10.0.0
settings_ui: ^2.0.2
fps_widget: ^1.0.1+2 fps_widget: ^1.0.1+2
provider: ^6.1.2 provider: ^6.1.2
freezed: ^2.5.8 freezed: ^2.5.8
@@ -40,6 +39,13 @@ dependencies:
modal_bottom_sheet: ^3.0.0 modal_bottom_sheet: ^3.0.0
file_picker: ^9.2.1 file_picker: ^9.2.1
# logs
talker: ^4.6.11
talker_flutter: ^4.6.11
talker_logger: ^4.6.11
talker_dio_logger: ^4.6.11
talker_bloc_logger: ^4.6.11
# annotation # annotation
json_annotation: ^4.9.0 json_annotation: ^4.9.0
@@ -54,8 +60,6 @@ dependencies:
flutter_keyboard_size: ^1.0.1 flutter_keyboard_size: ^1.0.1
# dio # dio
curl_logger_dio_interceptor: ^1.0.0
pretty_dio_logger: ^1.4.0
dio_smart_retry: ^7.0.1 dio_smart_retry: ^7.0.1
# plus # plus
@@ -67,7 +71,6 @@ dependencies:
drift_db_viewer: 2.1.0 drift_db_viewer: 2.1.0
sqlite3_flutter_libs: ^0.5.31 sqlite3_flutter_libs: ^0.5.31
# slang # slang
slang: ^4.4.1 slang: ^4.4.1
slang_flutter: ^4.4.0 slang_flutter: ^4.4.0