From 150a85ab24e96bf347c6521026a0ca62ab5512eb Mon Sep 17 00:00:00 2001 From: PetrovY Date: Mon, 23 Jun 2025 10:20:29 +0300 Subject: [PATCH] =?UTF-8?q?refactor(app):=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=B7=D0=B0=D0=B2=D0=B8=D1=81=D0=B8=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=B8=20=D0=B8=20=D1=83=D0=BB=D1=83=D1=87?= =?UTF-8?q?=D1=88=D0=B8=D1=82=D1=8C=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC=D0=B5?= =?UTF-8?q?=D0=BD=D1=82=D0=B0=D1=86=D0=B8=D1=8E=20=D0=B4=D0=BB=D1=8F=20?= =?UTF-8?q?=D1=81=D0=B5=D1=80=D0=B2=D0=B8=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app_services/aurora/app_services/README.md | 2 +- .../aurora/app_services/lib/app_services.dart | 1 + .../lib/src/app_location_service.dart | 18 ++++ .../lib/src/app_path_provider.dart | 4 +- .../lib/src/app_secure_storage.dart | 39 ++++---- app_services/aurora/app_services/pubspec.yaml | 12 +-- .../lib/src/app_location_service.dart | 50 +++++++++++ app_services/base/app_services/pubspec.yaml | 5 +- app_services/hms/app_services/.gitignore | 29 ++++++ app_services/hms/app_services/.metadata | 10 +++ app_services/hms/app_services/README.md | 1 + .../hms/app_services/analysis_options.yaml | 89 +++++++++++++++++++ .../hms/app_services/lib/app_services.dart | 5 ++ .../lib/src/app_location_service.dart | 18 ++++ .../lib/src/app_path_provider.dart | 18 ++++ .../lib/src/app_secure_storage.dart | 50 +++++++++++ app_services/hms/app_services/pubspec.yaml | 18 ++++ .../i_app_services/lib/i_app_services.dart | 1 + .../lib/src/i_location_service.dart | 9 ++ .../lib/src/i_path_provider.dart | 2 +- app_services/i_app_services/pubspec.yaml | 4 +- 21 files changed, 348 insertions(+), 37 deletions(-) create mode 100644 app_services/aurora/app_services/lib/src/app_location_service.dart create mode 100644 app_services/base/app_services/lib/src/app_location_service.dart create mode 100644 app_services/hms/app_services/.gitignore create mode 100644 app_services/hms/app_services/.metadata create mode 100644 app_services/hms/app_services/README.md create mode 100644 app_services/hms/app_services/analysis_options.yaml create mode 100644 app_services/hms/app_services/lib/app_services.dart create mode 100644 app_services/hms/app_services/lib/src/app_location_service.dart create mode 100644 app_services/hms/app_services/lib/src/app_path_provider.dart create mode 100644 app_services/hms/app_services/lib/src/app_secure_storage.dart create mode 100644 app_services/hms/app_services/pubspec.yaml create mode 100644 app_services/i_app_services/lib/src/i_location_service.dart diff --git a/app_services/aurora/app_services/README.md b/app_services/aurora/app_services/README.md index a03f3bd..8e025ca 100644 --- a/app_services/aurora/app_services/README.md +++ b/app_services/aurora/app_services/README.md @@ -1 +1 @@ -# Базовые сервисы для приложения \ No newline at end of file +# Реализация сервисов для Аврора OC \ No newline at end of file diff --git a/app_services/aurora/app_services/lib/app_services.dart b/app_services/aurora/app_services/lib/app_services.dart index a2dadb6..e8a7fd7 100644 --- a/app_services/aurora/app_services/lib/app_services.dart +++ b/app_services/aurora/app_services/lib/app_services.dart @@ -2,3 +2,4 @@ library; export 'src/app_path_provider.dart'; export 'src/app_secure_storage.dart'; +export 'src/app_location_service.dart'; diff --git a/app_services/aurora/app_services/lib/src/app_location_service.dart b/app_services/aurora/app_services/lib/src/app_location_service.dart new file mode 100644 index 0000000..655ea20 --- /dev/null +++ b/app_services/aurora/app_services/lib/src/app_location_service.dart @@ -0,0 +1,18 @@ +import 'package:i_app_services/i_app_services.dart'; + +/// {@template app_location_service} +/// Реализация сервиса для работы с гео на платформе Aurora. +/// {@endtemplate} +class AppLocationService implements ILocationService { + /// {@macro app_location_service} + const AppLocationService(); + + /// Наименование сервиса + static const name = 'AuroraAppLocationService'; + + @override + Future getCurrentPosition() { + // TODO: Реализовать получение текущей позиции в AuroraOS + throw UnimplementedError(); + } +} diff --git a/app_services/aurora/app_services/lib/src/app_path_provider.dart b/app_services/aurora/app_services/lib/src/app_path_provider.dart index ed1bb27..f3044d0 100644 --- a/app_services/aurora/app_services/lib/src/app_path_provider.dart +++ b/app_services/aurora/app_services/lib/src/app_path_provider.dart @@ -1,5 +1,4 @@ import 'package:i_app_services/i_app_services.dart'; -import 'package:path_provider/path_provider.dart'; /// {@template app_path_provider} /// Класс для Аврора реализации сервиса работы с путями @@ -13,6 +12,7 @@ class AppPathProvider implements IPathProvider { @override Future getAppDocumentsDirectoryPath() async { - return (await getApplicationDocumentsDirectory()).path; + // TODO: Реализовать для AuroraOS + throw UnimplementedError(); } } diff --git a/app_services/aurora/app_services/lib/src/app_secure_storage.dart b/app_services/aurora/app_services/lib/src/app_secure_storage.dart index 5af0c1d..eddba0b 100644 --- a/app_services/aurora/app_services/lib/src/app_secure_storage.dart +++ b/app_services/aurora/app_services/lib/src/app_secure_storage.dart @@ -1,5 +1,3 @@ -import 'package:flutter_secure_storage/flutter_secure_storage.dart'; -import 'package:flutter_secure_storage_aurora/flutter_secure_storage_aurora.dart'; import 'package:i_app_services/i_app_services.dart'; /// {@template app_secure_storage} @@ -12,7 +10,8 @@ final class AppSecureStorage implements ISecureStorage { /// Принимает: /// - [secretKey] - ключ шифрования данных AppSecureStorage({required this.secretKey}) { - FlutterSecureStorageAurora.setSecret(secretKey); + // Инициализация Aurora Secure Storage с ключом шифрования + // FlutterSecureStorageAurora.setSecret(secretKey); } @override @@ -20,34 +19,36 @@ final class AppSecureStorage implements ISecureStorage { static const name = 'AuroraAppSecureStorage'; - /// Экземпляр хранилища данных - final _box = const FlutterSecureStorage(); - - @override - Future clear() async { - await _box.deleteAll(); - } - @override Future delete(String key) async { - await _box.delete(key: key); - } - - @override - Future exists(String key) { - return _box.containsKey(key: key); + // TODO: Реализовать удаление ключа из Aurora Secure Storage + throw UnimplementedError(); } @override Future read(String key) async { - return _box.read(key: key); + // TODO: Реализовать чтение значения по ключу из Aurora Secure Storage + throw UnimplementedError(); } @override Future write(String key, String value) async { - await _box.write(key: key, value: value); + // TODO: Реализовать запись значения по ключу в Aurora Secure Storage + throw UnimplementedError(); } @override String get nameImpl => AppSecureStorage.name; + + @override + Future containsKey(String key) { + // TODO: Реализовать проверку наличия ключа в Aurora Secure Storage + throw UnimplementedError(); + } + + @override + Future deleteAll() { + // TODO: Реализовать удаление всех ключей из Aurora Secure Storage + throw UnimplementedError(); + } } diff --git a/app_services/aurora/app_services/pubspec.yaml b/app_services/aurora/app_services/pubspec.yaml index e26c212..1f7d0c5 100644 --- a/app_services/aurora/app_services/pubspec.yaml +++ b/app_services/aurora/app_services/pubspec.yaml @@ -4,22 +4,12 @@ version: 0.0.1 publish_to: none environment: - sdk: '>=3.16.2 <4.0.0' + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: sdk: flutter - # Зависимости для сервиса защищенного хранилища - flutter_secure_storage: 8.0.0 - flutter_secure_storage_aurora: - git: - url: https://gitlab.com/omprussia/flutter/flutter-community-plugins/flutter_secure_storage_aurora.git - ref: aurora-0.5.3 - - # для работы с путями (плагин встроен в sdk flutter 3.27.1) - path_provider: 2.1.5 - # Обязательные интерфейсы i_app_services: path: ../../i_app_services diff --git a/app_services/base/app_services/lib/src/app_location_service.dart b/app_services/base/app_services/lib/src/app_location_service.dart new file mode 100644 index 0000000..5f79b6a --- /dev/null +++ b/app_services/base/app_services/lib/src/app_location_service.dart @@ -0,0 +1,50 @@ +import 'package:geolocator/geolocator.dart'; +import 'package:i_app_services/i_app_services.dart'; + +/// {@template app_location_service} +/// Реализация сервиса для работы с гео в базовой реализацией Android/OS. +/// {@endtemplate} +class AppLocationService implements ILocationService { + /// {@macro app_location_service} + const AppLocationService(); + + /// Наименование сервиса + static const name = 'BaseAppLocationService'; + + @override + Future getCurrentPosition() async { + bool serviceEnabled; + LocationPermission permission; + + serviceEnabled = await Geolocator.isLocationServiceEnabled(); + if (!serviceEnabled) { + // Службы геолокации не включены, не продолжаем + // обращаться к позиции и запрашиваем у пользователей + // приложения включить службы геолокации. + return Future.error('Location services are disabled.'); + } + + permission = await Geolocator.checkPermission(); + if (permission == LocationPermission.denied) { + permission = await Geolocator.requestPermission(); + if (permission == LocationPermission.denied) { + // Разрешения отклонены, в следующий раз можно попробовать + // запросить разрешения снова (здесь также возвращается + // shouldShowRequestPermissionRationale Android. + // Согласно рекомендациям Android ваше приложение + // должно показать пояснительный интерфейс сейчас. + return Future.error('Location permissions are denied'); + } + } + if (permission == LocationPermission.deniedForever) { + // Разрешения отклонены навсегда, обрабатываем соответствующим образом. + return Future.error( + 'Location permissions are permanently denied, we cannot request permissions.', + ); + } + + // Когда мы доходим сюда, разрешения предоставлены и мы можем + // продолжить обращение к позиции устройства. + return await Geolocator.getCurrentPosition(); + } +} diff --git a/app_services/base/app_services/pubspec.yaml b/app_services/base/app_services/pubspec.yaml index 6e7ccc9..d4fe00f 100644 --- a/app_services/base/app_services/pubspec.yaml +++ b/app_services/base/app_services/pubspec.yaml @@ -4,7 +4,7 @@ version: 0.0.1 publish_to: none environment: - sdk: ^3.8.0 + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: @@ -19,6 +19,9 @@ dependencies: # для работы с путями в хранилища path_provider: 2.1.5 + # Работа с геолокацией + geolocator: 14.0.1 + # Обязательные интерфейсы i_app_services: path: ../../i_app_services diff --git a/app_services/hms/app_services/.gitignore b/app_services/hms/app_services/.gitignore new file mode 100644 index 0000000..ac5aa98 --- /dev/null +++ b/app_services/hms/app_services/.gitignore @@ -0,0 +1,29 @@ +# Miscellaneous +*.class +*.log +*.pyc +*.swp +.DS_Store +.atom/ +.buildlog/ +.history +.svn/ +migrate_working_dir/ + +# IntelliJ related +*.iml +*.ipr +*.iws +.idea/ + +# The .vscode folder contains launch configuration and tasks you configure in +# VS Code which you may wish to be included in version control, so this line +# is commented out by default. +#.vscode/ + +# Flutter/Dart/Pub related +# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock. +/pubspec.lock +**/doc/api/ +.dart_tool/ +build/ diff --git a/app_services/hms/app_services/.metadata b/app_services/hms/app_services/.metadata new file mode 100644 index 0000000..2b37703 --- /dev/null +++ b/app_services/hms/app_services/.metadata @@ -0,0 +1,10 @@ +# This file tracks properties of this Flutter project. +# Used by Flutter tool to assess capabilities and perform upgrades etc. +# +# This file should be version controlled and should not be manually edited. + +version: + revision: "7482962148e8d758338d8a28f589f317e1e42ba4" + channel: "stable" + +project_type: package diff --git a/app_services/hms/app_services/README.md b/app_services/hms/app_services/README.md new file mode 100644 index 0000000..2329884 --- /dev/null +++ b/app_services/hms/app_services/README.md @@ -0,0 +1 @@ +# Реализация сервисов для HarmonyOS \ No newline at end of file diff --git a/app_services/hms/app_services/analysis_options.yaml b/app_services/hms/app_services/analysis_options.yaml new file mode 100644 index 0000000..122f5f7 --- /dev/null +++ b/app_services/hms/app_services/analysis_options.yaml @@ -0,0 +1,89 @@ +include: package:flutter_lints/flutter.yaml + +# Включает правила из: +# - package:lints/core.yaml: основные правила критических проблем +# - package:lints/recommended.yaml: рекомендуемые правила для чистого кода +# - package:flutter_lints/flutter.yaml: специфичные правила для Flutter + +analyzer: + exclude: + - "android/**" + - "assets/**" + - "build/**" + - "config/**" + - "core/**" + - "res/**" + - "ios/**" + - "**/*.g.dart" + - "**/*.config.dart" + - "**/*.gen.dart" + - "**/*.freezed.dart" + - "**/generated/*" + - "**/*.gr.dart" + - "**/*.yaml" + - "app_services/aurora/**" + - "/app_services/aurora/**" + - "**/app_services/aurora/**" + - "**/*.lock.dart" +errors: + # Переопределения уровней ошибок (error/warning/info) + avoid_dynamic_calls: error # Запрещает использование dynamic для вызовов методов + avoid_returning_null_for_future: error # Запрещает возврат null вместо Future + avoid_slow_async_io: warning # Предупреждает о медленных асинхронных операциях ввода/вывода + avoid_type_to_string: warning # Предупреждает о неправильном использовании toString() для типов + cancel_subscriptions: error # Требует отмены подписок, предотвращает утечки памяти + close_sinks: error # Требует закрытия sink-ов, предотвращает утечки ресурсов + comment_references: warning # Проверяет корректность ссылок в комментариях + always_declare_return_types: error # Требует явного указания возвращаемых типов методов + always_require_non_null_named_parameters: warning # Требует использования @required для ненулевых параметров + avoid_bool_literals_in_conditional_expressions: warning # Запрещает избыточные булевы литералы в условных выражениях + avoid_return_types_on_setters: warning # Запрещает возвращаемые типы для сеттеров + avoid_returning_null: error # Запрещает возврат null + avoid_setters_without_getters: error # Требует создания геттера при наличии сеттера + avoid_void_async: error # Запрещает использование void для асинхронных функций + constant_identifier_names: error # Проверяет правильность именования констант + unnecessary_new: warning # Запрещает избыточное использование ключевого слова new + use_decorated_box: warning # Рекомендует использовать DecoratedBox вместо Container + use_colored_box: warning # Рекомендует использовать ColoredBox вместо Container с цветом + +linter: + rules: + # Нестандартные правила или правила с измененными значениями + always_put_required_named_parameters_first: true # Требовать размещать обязательные именованные параметры первыми + avoid_catches_without_on_clauses: true # Избегать catch без указания типа исключения + avoid_catching_errors: true # Избегать перехвата ошибок типа Error + avoid_equals_and_hash_code_on_mutable_classes: true # Избегать equals и hashCode в изменяемых классах + avoid_escaping_inner_quotes: true # Избегать экранирования внутренних кавычек + avoid_field_initializers_in_const_classes: true # Избегать инициализаторов полей в константных классах + avoid_implementing_value_types: true # Избегать реализации интерфейсов значимых типов + avoid_multiple_declarations_per_line: false # Разрешать несколько объявлений в одной строке + avoid_positional_boolean_parameters: true # Избегать позиционных булевых параметров + avoid_private_typedef_functions: true # Избегать приватных typedef-функций + avoid_redundant_argument_values: true # Избегать избыточных значений аргументов + avoid_returning_this: true # Избегать возврата this + cascade_invocations: true # Использовать каскадные вызовы + deprecated_consistency: true # Поддерживать согласованность устаревших элементов + do_not_use_environment: false # Разрешить использование Environment + leading_newlines_in_multiline_strings: true # Начинать многострочные строки с новой строки + no_runtimeType_toString: true # Не использовать runtimeType.toString() + one_member_abstracts: false # Разрешать абстрактные классы с одним методом + only_throw_errors: true # Выбрасывать только объекты Error + parameter_assignments: true # Запрещать присваивание значений параметрам + prefer_asserts_with_message: true # Использовать сообщения с assert + prefer_constructors_over_static_methods: true # Предпочитать конструкторы статическим методам + prefer_final_in_for_each: true # Использовать final в for-each циклах + prefer_final_locals: true # Использовать final для локальных переменных + public_member_api_docs: false # Не требовать документацию для всех публичных членов + require_trailing_commas: true # Требовать запятые в конце для улучшения форматирования + sort_constructors_first: true # Требовать размещать конструкторы первыми + sort_pub_dependencies: false # Не требовать сортировки зависимостей в pubspec + sort_unnamed_constructors_first: false # Не требовать размещать безымянные конструкторы первыми + use_is_even_rather_than_modulo: true # Использовать isEven вместо % 2 == 0 + use_late_for_private_fields_and_variables: false # Не требовать late для приватных полей + use_setters_to_change_properties: true # Использовать сеттеры для изменения свойств + use_string_buffers: true # Использовать StringBuffer для сложной конкатенации + use_to_and_as_if_applicable: true # Использовать методы to и as при применимости + no_literal_bool_comparisons: true # Запрещать сравнения с литералами true/false + use_key_in_widget_constructors: true # Обязательное указание ключа для stateful/stateless widgets + always_use_package_imports: true # Всегда использовать package: импорты + diff --git a/app_services/hms/app_services/lib/app_services.dart b/app_services/hms/app_services/lib/app_services.dart new file mode 100644 index 0000000..e8a7fd7 --- /dev/null +++ b/app_services/hms/app_services/lib/app_services.dart @@ -0,0 +1,5 @@ +library; + +export 'src/app_path_provider.dart'; +export 'src/app_secure_storage.dart'; +export 'src/app_location_service.dart'; diff --git a/app_services/hms/app_services/lib/src/app_location_service.dart b/app_services/hms/app_services/lib/src/app_location_service.dart new file mode 100644 index 0000000..8102d95 --- /dev/null +++ b/app_services/hms/app_services/lib/src/app_location_service.dart @@ -0,0 +1,18 @@ +import 'package:i_app_services/i_app_services.dart'; + +/// {@template app_location_service} +/// Реализация сервиса для работы с гео на HarmonyOS. +/// {@endtemplate} +class AppLocationService implements ILocationService { + /// {@macro app_location_service} + const AppLocationService(); + + /// Наименование сервиса + static const name = 'HarmonyAppLocationService'; + + @override + Future getCurrentPosition() { + // TODO: Реализовать получение текущей позиции в HarmonyOS + throw UnimplementedError(); + } +} diff --git a/app_services/hms/app_services/lib/src/app_path_provider.dart b/app_services/hms/app_services/lib/src/app_path_provider.dart new file mode 100644 index 0000000..08f28fb --- /dev/null +++ b/app_services/hms/app_services/lib/src/app_path_provider.dart @@ -0,0 +1,18 @@ +import 'package:i_app_services/i_app_services.dart'; + +/// {@template app_path_provider} +/// Класс для HarmonyOS реализации сервиса работы с путями +/// {@endtemplate} +class AppPathProvider implements IPathProvider { + /// {@macro app_path_provider} + const AppPathProvider(); + + /// Наименование сервиса + static const name = 'HarmonyAppPathProvider'; + + @override + Future getAppDocumentsDirectoryPath() async { + // TODO: Реализовать для HarmonyOS + throw UnimplementedError(); + } +} diff --git a/app_services/hms/app_services/lib/src/app_secure_storage.dart b/app_services/hms/app_services/lib/src/app_secure_storage.dart new file mode 100644 index 0000000..451e84b --- /dev/null +++ b/app_services/hms/app_services/lib/src/app_secure_storage.dart @@ -0,0 +1,50 @@ +import 'package:i_app_services/i_app_services.dart'; + +/// {@template app_secure_storage} +/// Класс для HarmonyOS реализации сервиса по работе с защищенным хранилищем +/// {@endtemplate} +final class AppSecureStorage implements ISecureStorage { + /// Создает сервис для работы с защищенным хранилищем + /// + /// Принимает: + /// - [secretKey] - ключ шифрования данных, если требуется + AppSecureStorage({required this.secretKey}); + + @override + final String secretKey; + + static const name = 'HarmonyAppSecureStorage'; + + @override + Future delete(String key) async { + // TODO: Реализовать удаление ключа из HarmonyOS Secure Storage + throw UnimplementedError(); + } + + @override + Future read(String key) async { + // TODO: Реализовать чтение значения по ключу из HarmonyOS Secure Storage + throw UnimplementedError(); + } + + @override + Future write(String key, String value) async { + // TODO: Реализовать запись значения по ключу в HarmonyOS Secure Storage + throw UnimplementedError(); + } + + @override + String get nameImpl => AppSecureStorage.name; + + @override + Future containsKey(String key) { + // TODO: Реализовать проверку наличия ключа в HarmonyOS Secure Storage + throw UnimplementedError(); + } + + @override + Future deleteAll() { + // TODO: Реализовать удаление всех ключей из HarmonyOS Secure Storage + throw UnimplementedError(); + } +} diff --git a/app_services/hms/app_services/pubspec.yaml b/app_services/hms/app_services/pubspec.yaml new file mode 100644 index 0000000..d29e521 --- /dev/null +++ b/app_services/hms/app_services/pubspec.yaml @@ -0,0 +1,18 @@ +name: app_services +description: "Huawei сервисы для приложения" +version: 0.0.1 +publish_to: none + +environment: + sdk: ">=3.0.0 <4.0.0" + +dependencies: + flutter: + sdk: flutter + + # Обязательные интерфейсы + i_app_services: + path: ../../i_app_services + +dev_dependencies: + flutter_lints: 6.0.0 diff --git a/app_services/i_app_services/lib/i_app_services.dart b/app_services/i_app_services/lib/i_app_services.dart index 036bc78..5b8c7ed 100644 --- a/app_services/i_app_services/lib/i_app_services.dart +++ b/app_services/i_app_services/lib/i_app_services.dart @@ -1,4 +1,5 @@ library; export 'src/i_path_provider.dart'; +export 'src/i_location_service.dart'; export 'src/i_secure_storage.dart'; diff --git a/app_services/i_app_services/lib/src/i_location_service.dart b/app_services/i_app_services/lib/src/i_location_service.dart new file mode 100644 index 0000000..1f2a020 --- /dev/null +++ b/app_services/i_app_services/lib/src/i_location_service.dart @@ -0,0 +1,9 @@ +/// {@template i_location_service} +/// Интерфейс для работы с геопозицией пользователя +/// {@endtemplate} +abstract interface class ILocationService { + static const name = 'ILocationService'; + + /// Метод для получения координат пользователя + Future getCurrentPosition(); +} diff --git a/app_services/i_app_services/lib/src/i_path_provider.dart b/app_services/i_app_services/lib/src/i_path_provider.dart index ead04b5..4627a36 100644 --- a/app_services/i_app_services/lib/src/i_path_provider.dart +++ b/app_services/i_app_services/lib/src/i_path_provider.dart @@ -4,6 +4,6 @@ abstract interface class IPathProvider { /// Наименования интерфейса static const name = 'IPathProvider'; - /// Получение path на внутренне хранилище приложения + /// Получение path на внутреннее хранилище приложения Future getAppDocumentsDirectoryPath(); } diff --git a/app_services/i_app_services/pubspec.yaml b/app_services/i_app_services/pubspec.yaml index 94228d0..9d81c53 100644 --- a/app_services/i_app_services/pubspec.yaml +++ b/app_services/i_app_services/pubspec.yaml @@ -1,10 +1,10 @@ name: i_app_services -description: "Хранит в себе все интерфейсы для реализации общих сервисов" +description: "Хранит в себе все интерфейсы для реализации сервисов" version: 0.0.1 publish_to: "none" environment: - sdk: ^3.8.0 + sdk: ">=3.0.0 <4.0.0" dependencies: flutter: