From ca4cb20d585a7d35f81ade955bf70cec4552037b Mon Sep 17 00:00:00 2001 From: Yuri Petrov <48598325+petrovyuri@users.noreply.github.com> Date: Wed, 26 Feb 2025 13:40:43 +0300 Subject: [PATCH] =?UTF-8?q?feat(app):=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=B8=D0=BC=D0=B5=D1=80=20?= =?UTF-8?q?=D1=81=D0=BE=20Scope=20(#5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat(app): Добавить пример со Scope * fix scope * feat: добавить скоуп с внутренней зависимостью от репозитория (#6) Co-authored-by: Artem Barkalov * feat: исправить обалсть видимости ProfileScope * feat: добавить фикс namespace плагинов --------- Co-authored-by: PetrovY Co-authored-by: Artem Barkalov --- .vscode/launch.json | 7 + android/build.gradle | 12 + lib/di/di_repositories.dart | 60 +++- .../presentation/screens/main_screen.dart | 23 +- .../repository/profile_mock_repository.dart | 14 + .../data/repository/profile_repository.dart | 24 ++ .../profile/domain/bloc/profile_bloc.dart | 39 +++ .../profile/domain/bloc/profile_event.dart | 17 ++ .../profile/domain/bloc/profile_state.dart | 36 +++ .../repository/i_profile_repository.dart | 8 + .../presentation/screens/profile_screen.dart | 48 ++++ .../profile_scope_mock_repository.dart | 14 + .../repository/profile_scope_repository.dart | 24 ++ .../domain/bloc/profile_scope_bloc.dart | 41 +++ .../domain/bloc/profile_scope_event.dart | 17 ++ .../domain/bloc/profile_scope_state.dart | 36 +++ .../i_profile_scope_repository.dart | 8 + .../presentation/profile_scope.dart | 77 +++++ .../screens/profile_scope_screen.dart | 39 +++ lib/router/app_router.dart | 12 +- pubspec.lock | 262 +++++++++--------- pubspec.yaml | 1 + 22 files changed, 684 insertions(+), 135 deletions(-) create mode 100644 lib/features/profile/data/repository/profile_mock_repository.dart create mode 100644 lib/features/profile/data/repository/profile_repository.dart create mode 100644 lib/features/profile/domain/bloc/profile_bloc.dart create mode 100644 lib/features/profile/domain/bloc/profile_event.dart create mode 100644 lib/features/profile/domain/bloc/profile_state.dart create mode 100644 lib/features/profile/domain/repository/i_profile_repository.dart create mode 100644 lib/features/profile/presentation/screens/profile_screen.dart create mode 100644 lib/features/profile_scope/data/repository/profile_scope_mock_repository.dart create mode 100644 lib/features/profile_scope/data/repository/profile_scope_repository.dart create mode 100644 lib/features/profile_scope/domain/bloc/profile_scope_bloc.dart create mode 100644 lib/features/profile_scope/domain/bloc/profile_scope_event.dart create mode 100644 lib/features/profile_scope/domain/bloc/profile_scope_state.dart create mode 100644 lib/features/profile_scope/domain/repository/i_profile_scope_repository.dart create mode 100644 lib/features/profile_scope/presentation/profile_scope.dart create mode 100644 lib/features/profile_scope/presentation/screens/profile_scope_screen.dart diff --git a/.vscode/launch.json b/.vscode/launch.json index daf3e19..7f0c0a7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -7,6 +7,13 @@ "request": "launch", "program": "${workspaceFolder}/lib/targets/dev.dart" }, + + { + "name": "stage", + "type": "dart", + "request": "launch", + "program": "${workspaceFolder}/lib/targets/stage.dart" + }, // { // "name": "GMS_stage", // "type": "dart", diff --git a/android/build.gradle b/android/build.gradle index d2ffbff..003b12f 100644 --- a/android/build.gradle +++ b/android/build.gradle @@ -9,6 +9,18 @@ rootProject.buildDir = "../build" subprojects { project.buildDir = "${rootProject.buildDir}/${project.name}" } +// Для поддержки плагинов не переведенных на namespace +subprojects { + afterEvaluate { project -> + if (project.hasProperty('android')) { + project.android { + if (namespace == null) { + namespace project.group + } + } + } + } +} subprojects { project.evaluationDependsOn(":app") } diff --git a/lib/di/di_repositories.dart b/lib/di/di_repositories.dart index f76422e..dc10bc3 100644 --- a/lib/di/di_repositories.dart +++ b/lib/di/di_repositories.dart @@ -8,6 +8,12 @@ import 'package:friflex_starter/features/auth/domain/repository/i_auth_repositor import 'package:friflex_starter/features/main/data/repository/main_mock_repository.dart'; import 'package:friflex_starter/features/main/data/repository/main_repository.dart'; import 'package:friflex_starter/features/main/domain/repository/i_main_repository.dart'; +import 'package:friflex_starter/features/profile/data/repository/profile_mock_repository.dart'; +import 'package:friflex_starter/features/profile/data/repository/profile_repository.dart'; +import 'package:friflex_starter/features/profile/domain/repository/i_profile_repository.dart'; +import 'package:friflex_starter/features/profile_scope/data/repository/profile_scope_mock_repository.dart'; +import 'package:friflex_starter/features/profile_scope/data/repository/profile_scope_repository.dart'; +import 'package:friflex_starter/features/profile_scope/domain/repository/i_profile_scope_repository.dart'; /// Список названий моковых репозиториев, которые должны быть подменены /// для использования в сборке stage окружения @@ -34,6 +40,12 @@ final class DiRepositories { /// Интерфейс для работы с репозиторием главного сервиса late final IMainRepository mainRepository; + /// Интерфейс для работы с репозиторием профиля + late final IProfileRepository profileRepository; + + /// Интерфейс для работы с репозиторием профиля scope + late final IProfileScopeRepository profileScopeRepository; + /// Метод для инициализации репозиториев в приложении /// /// Принимает: @@ -60,7 +72,7 @@ final class DiRepositories { onProgress(authRepository.name); } on Object catch (error, stackTrace) { onError( - 'Ошибка инициализации репозитория $IAuthRepository', + 'Ошибка инициализации репозитория IAuthRepository', error, stackTrace, ); @@ -82,7 +94,51 @@ final class DiRepositories { onProgress(mainRepository.name); } on Object catch (error, stackTrace) { onError( - 'Ошибка инициализации репозитория $IMainRepository', + 'Ошибка инициализации репозитория IMainRepository', + error, + stackTrace, + ); + } + + try { + // Инициализация репозитория профиля + profileRepository = _lazyInitRepo( + mockFactory: ProfileMockRepository.new, + mainFactory: () => ProfileRepository( + httpClient: diContainer.httpClientFactory( + diContainer.debugService, + diContainer.appConfig, + ), + ), + onProgress: onProgress, + environment: diContainer.env, + ); + onProgress(profileRepository.name); + } on Object catch (error, stackTrace) { + onError( + 'Ошибка инициализации репозитория IProfileRepository', + error, + stackTrace, + ); + } + + try { + // Инициализация репозитория профиля scope + profileScopeRepository = _lazyInitRepo( + mockFactory: ProfileScopeMockRepository.new, + mainFactory: () => ProfileScopeRepository( + httpClient: diContainer.httpClientFactory( + diContainer.debugService, + diContainer.appConfig, + ), + ), + onProgress: onProgress, + environment: diContainer.env, + ); + onProgress(mainRepository.name); + } on Object catch (error, stackTrace) { + onError( + 'Ошибка инициализации репозитория IProfileScopeRepository', error, stackTrace, ); diff --git a/lib/features/main/presentation/screens/main_screen.dart b/lib/features/main/presentation/screens/main_screen.dart index 52557a0..eb1e19f 100644 --- a/lib/features/main/presentation/screens/main_screen.dart +++ b/lib/features/main/presentation/screens/main_screen.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; class MainScreen extends StatelessWidget { const MainScreen({super.key}); @@ -8,7 +9,27 @@ class MainScreen extends StatelessWidget { return Scaffold( appBar: AppBar( title: const Text('Main Screen'), - ), + ), + body: Center( + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + ElevatedButton( + onPressed: () { + context.push('/profile'); + }, + child: const Text('Открыть профиль'), + ), + const SizedBox(height: 16), + ElevatedButton( + onPressed: () { + context.push('/profile_scope'); + }, + child: const Text('Открыть профиль с областью видимости'), + ), + ], + ), + ), ); } } diff --git a/lib/features/profile/data/repository/profile_mock_repository.dart b/lib/features/profile/data/repository/profile_mock_repository.dart new file mode 100644 index 0000000..76c09a5 --- /dev/null +++ b/lib/features/profile/data/repository/profile_mock_repository.dart @@ -0,0 +1,14 @@ +import '../../domain/repository/i_profile_repository.dart'; + +/// {@template ProfileMockRepository} +/// +/// {@endtemplate} +final class ProfileMockRepository implements IProfileRepository { + @override + String get name => 'ProfileMockRepository'; + + @override + Future fetchUserProfile(String id) { + return Future.value('MOCK Yura Petrov'); + } +} diff --git a/lib/features/profile/data/repository/profile_repository.dart b/lib/features/profile/data/repository/profile_repository.dart new file mode 100644 index 0000000..c1e8b84 --- /dev/null +++ b/lib/features/profile/data/repository/profile_repository.dart @@ -0,0 +1,24 @@ +import 'package:friflex_starter/app/http/i_http_client.dart'; + +import '../../domain/repository/i_profile_repository.dart'; + +/// {@template ProfileRepository} +/// +/// {@endtemplate} +final class ProfileRepository implements IProfileRepository { + final IHttpClient httpClient; + + ProfileRepository({required this.httpClient}); + + @override + String get name => 'ProfileRepository'; + + @override + Future fetchUserProfile(String id) async { + // Какой-то запрос к серверу + await Future.delayed(const Duration(seconds: 1)); + // httpClient.get('https://example.com/profile/$id'); + + return 'Yura Petrov'; + } +} diff --git a/lib/features/profile/domain/bloc/profile_bloc.dart b/lib/features/profile/domain/bloc/profile_bloc.dart new file mode 100644 index 0000000..e53ffcf --- /dev/null +++ b/lib/features/profile/domain/bloc/profile_bloc.dart @@ -0,0 +1,39 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:friflex_starter/features/profile/domain/repository/i_profile_repository.dart'; + +part 'profile_event.dart'; +part 'profile_state.dart'; + +class ProfileBloc extends Bloc { + ProfileBloc(this._profileRepository) : super(ProfileInitialState()) { + // Вам необходимо добавлять только + // один обработчик событий в конструкторе + on((event, emit) async { + if (event is ProfileFetchProfileEvent) { + await _fetchProfile(event, emit); + } + }); + } + + final IProfileRepository _profileRepository; + + Future _fetchProfile( + ProfileFetchProfileEvent event, + Emitter emit, + ) async { + try { + emit(ProfileWaitingState()); + final data = await _profileRepository.fetchUserProfile(event.id); + emit(ProfileSuccessState(data: data)); + } on Object catch (error, stackTrace) { + emit( + ProfileErrorState( + message: 'Ошибка при загрузке профиля', + error: error, + stackTrace: stackTrace, + ), + ); + } + } +} diff --git a/lib/features/profile/domain/bloc/profile_event.dart b/lib/features/profile/domain/bloc/profile_event.dart new file mode 100644 index 0000000..88f7f40 --- /dev/null +++ b/lib/features/profile/domain/bloc/profile_event.dart @@ -0,0 +1,17 @@ +part of 'profile_bloc.dart'; + +sealed class ProfileEvent extends Equatable { + const ProfileEvent(); + + @override + List get props => []; +} + +final class ProfileFetchProfileEvent extends ProfileEvent { + final String id; + + const ProfileFetchProfileEvent({required this.id}); + + @override + List get props => [id]; +} diff --git a/lib/features/profile/domain/bloc/profile_state.dart b/lib/features/profile/domain/bloc/profile_state.dart new file mode 100644 index 0000000..c368b35 --- /dev/null +++ b/lib/features/profile/domain/bloc/profile_state.dart @@ -0,0 +1,36 @@ +part of 'profile_bloc.dart'; + +sealed class ProfileState extends Equatable { + const ProfileState(); + + @override + List get props => []; +} + +final class ProfileInitialState extends ProfileState {} + +final class ProfileWaitingState extends ProfileState {} + +final class ProfileErrorState extends ProfileState { + final String message; + final Object error; + final StackTrace? stackTrace; + + const ProfileErrorState({ + required this.message, + required this.error, + this.stackTrace, + }); + + @override + List get props => [message, error]; +} + +final class ProfileSuccessState extends ProfileState { + final Object data; + + const ProfileSuccessState({required this.data}); + + @override + List get props => [data]; +} diff --git a/lib/features/profile/domain/repository/i_profile_repository.dart b/lib/features/profile/domain/repository/i_profile_repository.dart new file mode 100644 index 0000000..8209046 --- /dev/null +++ b/lib/features/profile/domain/repository/i_profile_repository.dart @@ -0,0 +1,8 @@ +import 'package:friflex_starter/di/di_base_repo.dart'; + +/// {@template IProfileRepository} +/// +/// {@endtemplate} +abstract interface class IProfileRepository with DiBaseRepo { + Future fetchUserProfile(String id); +} diff --git a/lib/features/profile/presentation/screens/profile_screen.dart b/lib/features/profile/presentation/screens/profile_screen.dart new file mode 100644 index 0000000..d04b362 --- /dev/null +++ b/lib/features/profile/presentation/screens/profile_screen.dart @@ -0,0 +1,48 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:friflex_starter/app/app_context_ext.dart'; +import 'package:friflex_starter/features/profile/domain/bloc/profile_bloc.dart'; + +// Класс экрана, где мы инициализируем ProfileBloc +// и вызываем событие ProfileFetchProfileEvent +class ProfileScreen extends StatelessWidget { + const ProfileScreen({super.key}); + + @override + Widget build(BuildContext context) { + final profileRepository = context.di.repositories.profileRepository; + // Здесь мы инициализируем ProfileBloc + // и вызываем событие ProfileFetchProfileEvent + // Или любые другие события, которые вам нужны + return BlocProvider( + create: (context) => ProfileBloc(profileRepository) + ..add(const ProfileFetchProfileEvent(id: '1')), + child: const _ProfileScreenView(), + ); + } +} + +/// Виджет, который отображает UI экрана +class _ProfileScreenView extends StatelessWidget { + const _ProfileScreenView(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar( + title: const Text('Profile'), + ), + body: Center( + child: BlocBuilder( + builder: (context, state) { + return switch (state) { + ProfileSuccessState() => Text('Data: ${state.props.first}'), + ProfileErrorState() => Text('Error: ${state.message}'), + _ => const CircularProgressIndicator(), + }; + }, + ), + ), + ); + } +} diff --git a/lib/features/profile_scope/data/repository/profile_scope_mock_repository.dart b/lib/features/profile_scope/data/repository/profile_scope_mock_repository.dart new file mode 100644 index 0000000..6ff04d0 --- /dev/null +++ b/lib/features/profile_scope/data/repository/profile_scope_mock_repository.dart @@ -0,0 +1,14 @@ +import '../../domain/repository/i_profile_scope_repository.dart'; + +/// {@template ProfileScopeMockRepository} +/// +/// {@endtemplate} +final class ProfileScopeMockRepository implements IProfileScopeRepository { + @override + String get name => 'ProfileScopeMockRepository'; + + @override + Future fetchUserProfile(String id) async { + return 'MOCK Yura Petrov'; + } +} diff --git a/lib/features/profile_scope/data/repository/profile_scope_repository.dart b/lib/features/profile_scope/data/repository/profile_scope_repository.dart new file mode 100644 index 0000000..7104f16 --- /dev/null +++ b/lib/features/profile_scope/data/repository/profile_scope_repository.dart @@ -0,0 +1,24 @@ +import 'package:friflex_starter/app/http/i_http_client.dart'; + +import '../../domain/repository/i_profile_scope_repository.dart'; + +/// {@template ProfileScopeRepository} +/// +/// {@endtemplate} +final class ProfileScopeRepository implements IProfileScopeRepository { + final IHttpClient httpClient; + + ProfileScopeRepository({required this.httpClient}); + + @override + String get name => 'ProfileScopeRepository'; + + @override + Future fetchUserProfile(String id) async { + // Какой-то запрос к серверу + await Future.delayed(const Duration(seconds: 1)); + // httpClient.get('https://example.com/profile/$id'); + + return 'Yura Petrov'; + } +} diff --git a/lib/features/profile_scope/domain/bloc/profile_scope_bloc.dart b/lib/features/profile_scope/domain/bloc/profile_scope_bloc.dart new file mode 100644 index 0000000..c1b658d --- /dev/null +++ b/lib/features/profile_scope/domain/bloc/profile_scope_bloc.dart @@ -0,0 +1,41 @@ +import 'package:equatable/equatable.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:friflex_starter/features/profile_scope/domain/repository/i_profile_scope_repository.dart'; + +part 'profile_scope_event.dart'; +part 'profile_scope_state.dart'; + +class ProfileScopeBloc extends Bloc { + ProfileScopeBloc({required IProfileScopeRepository profileRepository}) + : _profileRepository = profileRepository, + super(ProfileScopeInitialState()) { + // Вам необходимо добавлять только + // один обработчик событий в конструкторе + on((event, emit) async { + return switch (event) { + ProfileScopeFetchProfileEvent() => await _fetchProfile(event, emit), + }; + }); + } + + final IProfileScopeRepository _profileRepository; + + Future _fetchProfile( + ProfileScopeFetchProfileEvent event, + Emitter emit, + ) async { + try { + emit(ProfileScopeWaitingState()); + final data = await _profileRepository.fetchUserProfile(event.id); + emit(ProfileScopeSuccessState(data: data)); + } on Object catch (error, stackTrace) { + emit( + ProfileScopeErrorState( + message: 'Ошибка при загрузке профиля', + error: error, + stackTrace: stackTrace, + ), + ); + } + } +} diff --git a/lib/features/profile_scope/domain/bloc/profile_scope_event.dart b/lib/features/profile_scope/domain/bloc/profile_scope_event.dart new file mode 100644 index 0000000..b8a0ef7 --- /dev/null +++ b/lib/features/profile_scope/domain/bloc/profile_scope_event.dart @@ -0,0 +1,17 @@ +part of 'profile_scope_bloc.dart'; + +sealed class ProfileScopeEvent extends Equatable { + const ProfileScopeEvent(); + + @override + List get props => []; +} + +final class ProfileScopeFetchProfileEvent extends ProfileScopeEvent { + final String id; + + const ProfileScopeFetchProfileEvent({required this.id}); + + @override + List get props => [id]; +} diff --git a/lib/features/profile_scope/domain/bloc/profile_scope_state.dart b/lib/features/profile_scope/domain/bloc/profile_scope_state.dart new file mode 100644 index 0000000..6d6b842 --- /dev/null +++ b/lib/features/profile_scope/domain/bloc/profile_scope_state.dart @@ -0,0 +1,36 @@ +part of 'profile_scope_bloc.dart'; + +sealed class ProfileScopeState extends Equatable { + const ProfileScopeState(); + + @override + List get props => []; +} + +final class ProfileScopeInitialState extends ProfileScopeState {} + +final class ProfileScopeWaitingState extends ProfileScopeState {} + +final class ProfileScopeErrorState extends ProfileScopeState { + final String message; + final Object error; + final StackTrace? stackTrace; + + const ProfileScopeErrorState({ + required this.message, + required this.error, + this.stackTrace, + }); + + @override + List get props => [message, error]; +} + +final class ProfileScopeSuccessState extends ProfileScopeState { + final Object data; + + const ProfileScopeSuccessState({required this.data}); + + @override + List get props => [data]; +} diff --git a/lib/features/profile_scope/domain/repository/i_profile_scope_repository.dart b/lib/features/profile_scope/domain/repository/i_profile_scope_repository.dart new file mode 100644 index 0000000..d326ae2 --- /dev/null +++ b/lib/features/profile_scope/domain/repository/i_profile_scope_repository.dart @@ -0,0 +1,8 @@ +import 'package:friflex_starter/di/di_base_repo.dart'; + +/// {@template IProfileScopeRepository} +/// +/// {@endtemplate} +abstract interface class IProfileScopeRepository with DiBaseRepo { + Future fetchUserProfile(String id); +} diff --git a/lib/features/profile_scope/presentation/profile_scope.dart b/lib/features/profile_scope/presentation/profile_scope.dart new file mode 100644 index 0000000..99ba5fb --- /dev/null +++ b/lib/features/profile_scope/presentation/profile_scope.dart @@ -0,0 +1,77 @@ +import 'package:flutter/material.dart'; +import 'package:friflex_starter/app/app_context_ext.dart'; +import 'package:friflex_starter/features/profile_scope/domain/bloc/profile_scope_bloc.dart'; + +class ProfileInheritedScope extends InheritedWidget { + const ProfileInheritedScope({ + required this.profileScopeBloc, + required super.child, + super.key, + }); + + final ProfileScopeBloc profileScopeBloc; + + @override + bool updateShouldNotify(ProfileInheritedScope oldWidget) => + profileScopeBloc != oldWidget.profileScopeBloc; +} + +class ProfileScope extends StatefulWidget { + const ProfileScope({ + required this.child, + super.key, + }); + + final Widget child; + + static ProfileInheritedScope? maybeOf( + BuildContext context, { + bool listen = false, + }) { + return listen + ? context.dependOnInheritedWidgetOfExactType() + : context.getInheritedWidgetOfExactType(); + } + + static ProfileInheritedScope of( + BuildContext context, { + bool listen = false, + }) { + final result = maybeOf(context, listen: listen); + + if (result == null) { + throw StateError( + 'ProfileScope is not found above widget ${context.widget}', + ); + } + + return result; + } + + @override + State createState() => _ProfileScopeState(); +} + +class _ProfileScopeState extends State { + late final ProfileScopeBloc _profileScopeBloc; + + @override + void initState() { + super.initState(); + + _profileScopeBloc = + ProfileScopeBloc(profileRepository: context.di.repositories.profileScopeRepository); + _profileScopeBloc.add(const ProfileScopeFetchProfileEvent(id: '1')); + } + + @override + void dispose() { + _profileScopeBloc.close(); + super.dispose(); + } + + @override + Widget build(BuildContext context) { + return ProfileInheritedScope(profileScopeBloc: _profileScopeBloc, child: widget.child); + } +} diff --git a/lib/features/profile_scope/presentation/screens/profile_scope_screen.dart b/lib/features/profile_scope/presentation/screens/profile_scope_screen.dart new file mode 100644 index 0000000..72156cb --- /dev/null +++ b/lib/features/profile_scope/presentation/screens/profile_scope_screen.dart @@ -0,0 +1,39 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_bloc/flutter_bloc.dart'; +import 'package:friflex_starter/features/profile_scope/domain/bloc/profile_scope_bloc.dart'; +import 'package:friflex_starter/features/profile_scope/presentation/profile_scope.dart'; + +// Класс экрана, где мы инициализируем ProfileScopeBloc +class ProfileScopeScreen extends StatelessWidget { + const ProfileScopeScreen({super.key}); + + @override + Widget build(BuildContext context) { + return const ProfileScope( + child: _ProfileScopeView(), + ); + } +} + +class _ProfileScopeView extends StatelessWidget { + const _ProfileScopeView(); + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(title: const Text('Profile Scope')), + body: Center( + child: BlocBuilder( + bloc: ProfileScope.of(context).profileScopeBloc, + builder: (context, state) { + return switch (state) { + ProfileScopeSuccessState() => Text('Data: ${state.props.first}'), + ProfileScopeErrorState() => Text('Error: ${state.message}'), + _ => const CircularProgressIndicator(), + }; + }, + ), + ), + ); + } +} diff --git a/lib/router/app_router.dart b/lib/router/app_router.dart index f840ca1..60edc4a 100644 --- a/lib/router/app_router.dart +++ b/lib/router/app_router.dart @@ -2,6 +2,8 @@ import 'package:flutter/cupertino.dart'; import 'package:friflex_starter/features/debug/debug_routes.dart'; import 'package:friflex_starter/features/debug/i_debug_service.dart'; import 'package:friflex_starter/features/main/presentation/main_routes.dart'; +import 'package:friflex_starter/features/profile/presentation/screens/profile_screen.dart'; +import 'package:friflex_starter/features/profile_scope/presentation/screens/profile_scope_screen.dart'; import 'package:friflex_starter/features/root/root_screen.dart'; import 'package:friflex_starter/features/splash/splash_screen.dart'; import 'package:go_router/go_router.dart'; @@ -15,7 +17,7 @@ class AppRouter { static final rootNavigatorKey = GlobalKey(); /// Начальный роут приложения - static String get initialLocation => '/debug'; + static String get initialLocation => '/debug'; /// Метод для создания экземпляра GoRouter static GoRouter createRouter(IDebugService debugService) { @@ -37,6 +39,14 @@ class AppRouter { path: '/splash', builder: (context, state) => const SplashScreen(), ), + GoRoute( + path: '/profile', + builder: (context, state) => const ProfileScreen(), + ), + GoRoute( + path: '/profile_scope', + builder: (context, state) => const ProfileScopeScreen(), + ), ], ); } diff --git a/pubspec.lock b/pubspec.lock index 8623c53..2c9d857 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -6,7 +6,7 @@ packages: description: name: _fe_analyzer_shared sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "76.0.0" _macros: @@ -19,7 +19,7 @@ packages: description: name: analyzer sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.11.0" app_services: @@ -34,7 +34,7 @@ packages: description: name: archive sha256: "6199c74e3db4fbfbd04f66d739e72fe11c8a8957d5f219f1f4482dbde6420b5a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.2" args: @@ -42,23 +42,23 @@ packages: description: name: args sha256: bf9f5caeea8d8fe6721a9c358dd8a5c1947b27f1cfaa18b39c301273594919e6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.6.0" asn1lib: dependency: transitive description: name: asn1lib - sha256: "4bae5ae63e6d6dd17c4aac8086f3dec26c0236f6a0f03416c6c19d830c367cf5" - url: "https://pub.dev" + sha256: "1c296cd268f486cabcc3930e9b93a8133169305f18d722916e675959a88f6d2c" + url: "https://pub.flutter-io.cn" source: hosted - version: "1.5.8" + version: "1.5.9" async: dependency: transitive description: name: async sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.11.0" bloc: @@ -66,7 +66,7 @@ packages: description: name: bloc sha256: "106842ad6569f0b60297619e9e0b1885c2fb9bf84812935490e6c5275777804e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.1.4" boolean_selector: @@ -74,7 +74,7 @@ packages: description: name: boolean_selector sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" build: @@ -82,7 +82,7 @@ packages: description: name: build sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.2" build_config: @@ -90,31 +90,31 @@ packages: description: name: build_config sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" - url: "https://pub.dev" + sha256: "8e928697a82be082206edb0b9c99c5a4ad6bc31c9e9b8b2f291ae65cd4a25daa" + url: "https://pub.flutter-io.cn" source: hosted - version: "4.0.3" + version: "4.0.4" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" - url: "https://pub.dev" + sha256: b9e4fda21d846e192628e7a4f6deda6888c36b5b69ba02ff291a01fd529140f0 + url: "https://pub.flutter-io.cn" source: hosted - version: "2.4.3" + version: "2.4.4" build_runner: dependency: "direct dev" description: name: build_runner sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.14" build_runner_core: @@ -122,7 +122,7 @@ packages: description: name: build_runner_core sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.0.0" built_collection: @@ -130,7 +130,7 @@ packages: description: name: built_collection sha256: "376e3dd27b51ea877c28d525560790aee2e6fbb5f20e2f85d5081027d94e2100" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.1.1" built_value: @@ -138,7 +138,7 @@ packages: description: name: built_value sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.9.3" characters: @@ -146,7 +146,7 @@ packages: description: name: characters sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" checked_yaml: @@ -154,7 +154,7 @@ packages: description: name: checked_yaml sha256: feb6bed21949061731a7a75fc5d2aa727cf160b91af9a3e464c5e3a32e28b5ff - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" clock: @@ -162,7 +162,7 @@ packages: description: name: clock sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" code_builder: @@ -170,7 +170,7 @@ packages: description: name: code_builder sha256: "0ec10bf4a89e4c613960bf1e8b42c64127021740fb21640c29c909826a5eea3e" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.10.1" collection: @@ -178,7 +178,7 @@ packages: description: name: collection sha256: a1ace0a119f20aabc852d165077c036cd864315bd99b7eaa10a60100341941bf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.19.0" color: @@ -186,7 +186,7 @@ packages: description: name: color sha256: ddcdf1b3badd7008233f5acffaf20ca9f5dc2cd0172b75f68f24526a5f5725cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.0" convert: @@ -194,7 +194,7 @@ packages: description: name: convert sha256: b30acd5944035672bc15c6b7a8b47d773e41e2f17de064350988c5d02adb1c68 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.2" crypto: @@ -202,7 +202,7 @@ packages: description: name: crypto sha256: "1e445881f28f22d6140f181e07737b22f1e099a5e1ff94b0af2f9e4a463f4855" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.6" cupertino_icons: @@ -210,23 +210,23 @@ packages: description: name: cupertino_icons sha256: ba631d1c7f7bef6b729a622b7b752645a2d076dba9976925b8f25725a30e1ee6 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.8" dart_style: dependency: transitive description: name: dart_style - sha256: "7856d364b589d1f08986e140938578ed36ed948581fbc3bc9aef1805039ac5ab" - url: "https://pub.dev" + sha256: "7306ab8a2359a48d22310ad823521d723acfed60ee1f7e37388e8986853b6820" + url: "https://pub.flutter-io.cn" source: hosted - version: "2.3.7" + version: "2.3.8" dartx: dependency: transitive description: name: dartx sha256: "8b25435617027257d43e6508b5fe061012880ddfdaa75a71d607c3de2a13d244" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.0" dio: @@ -234,7 +234,7 @@ packages: description: name: dio sha256: "5598aa796bbf4699afd5c67c0f5f6e2ed542afc956884b9cd58c306966efc260" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.7.0" dio_web_adapter: @@ -242,7 +242,7 @@ packages: description: name: dio_web_adapter sha256: "33259a9276d6cea88774a0000cfae0d861003497755969c92faa223108620dc8" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" encrypt: @@ -250,7 +250,7 @@ packages: description: name: encrypt sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.0.3" envied: @@ -258,7 +258,7 @@ packages: description: name: envied sha256: "08a9012e5d93e1a816919a52e37c7b8367e73ebb8d52d1ca7dd6fcd875a2cd2c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" envied_generator: @@ -266,15 +266,15 @@ packages: description: name: envied_generator sha256: "9a49ca9f3744069661c4f2c06993647699fae2773bca10b593fbb3228d081027" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.1" equatable: - dependency: transitive + dependency: "direct main" description: name: equatable sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.7" fake_async: @@ -282,7 +282,7 @@ packages: description: name: fake_async sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.1" ffi: @@ -290,7 +290,7 @@ packages: description: name: ffi sha256: "16ed7b077ef01ad6170a3d0c57caa4a112a38d7a2ed5602e0aca9ca6f3d98da6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.3" file: @@ -298,7 +298,7 @@ packages: description: name: file sha256: a3b4f84adafef897088c160faf7dfffb7696046cb13ae90b508c2cbc95d3b8d4 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "7.0.1" fixnum: @@ -306,7 +306,7 @@ packages: description: name: fixnum sha256: b6dc7065e46c974bc7c5f143080a6764ec7a4be6da1285ececdc37be96de53be - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" flutter: @@ -319,7 +319,7 @@ packages: description: name: flutter_bloc sha256: "890c51c8007f0182360e523518a0c732efb89876cb4669307af7efada5b55557" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.1.1" flutter_gen: @@ -327,7 +327,7 @@ packages: description: name: flutter_gen sha256: d7e4e57f606d73628b97765a67fdfb5a97e24cd2183e170afa8d1f62e48a9d5c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.8.0" flutter_gen_core: @@ -335,7 +335,7 @@ packages: description: name: flutter_gen_core sha256: "46ecf0e317413dd065547887c43f93f55e9653e83eb98dc13dd07d40dd225325" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.8.0" flutter_gen_runner: @@ -343,7 +343,7 @@ packages: description: name: flutter_gen_runner sha256: "77f0a02fc30d9fcf2549fe874eb3fde091435724904bcbb1af60aa40cbfab1f4" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "5.8.0" flutter_lints: @@ -351,7 +351,7 @@ packages: description: name: flutter_lints sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.3" flutter_localizations: @@ -364,7 +364,7 @@ packages: description: name: flutter_secure_storage sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "8.0.0" flutter_secure_storage_aurora: @@ -381,7 +381,7 @@ packages: description: name: flutter_secure_storage_linux sha256: bf7404619d7ab5c0a1151d7c4e802edad8f33535abfbeff2f9e1fe1274e2d705 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.2" flutter_secure_storage_macos: @@ -389,7 +389,7 @@ packages: description: name: flutter_secure_storage_macos sha256: "6c0a2795a2d1de26ae202a0d78527d163f4acbb11cde4c75c670f3a0fc064247" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" flutter_secure_storage_platform_interface: @@ -397,7 +397,7 @@ packages: description: name: flutter_secure_storage_platform_interface sha256: cf91ad32ce5adef6fba4d736a542baca9daf3beac4db2d04be350b87f69ac4a8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.2" flutter_secure_storage_web: @@ -405,7 +405,7 @@ packages: description: name: flutter_secure_storage_web sha256: f4ebff989b4f07b2656fb16b47852c0aab9fed9b4ec1c70103368337bc1886a9 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" flutter_secure_storage_windows: @@ -413,7 +413,7 @@ packages: description: name: flutter_secure_storage_windows sha256: "38f9501c7cb6f38961ef0e1eacacee2b2d4715c63cc83fe56449c4d3d0b47255" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" flutter_svg: @@ -421,7 +421,7 @@ packages: description: name: flutter_svg sha256: c200fd79c918a40c5cd50ea0877fa13f81bdaf6f0a5d3dbcc2a13e3285d6aa1b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.17" flutter_test: @@ -447,23 +447,23 @@ packages: description: name: frontend_server_client sha256: f64a0333a82f30b0cca061bc3d143813a486dc086b574bfb233b7c1372427694 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.0.0" glob: dependency: transitive description: name: glob - sha256: "0e7014b3b7d4dac1ca4d6114f82bf1782ee86745b9b42a92c9289c23d8a0ab63" - url: "https://pub.dev" + sha256: c3f1ee72c96f8f78935e18aa8cecced9ab132419e8625dc187e1c2408efc20de + url: "https://pub.flutter-io.cn" source: hosted - version: "2.1.2" + version: "2.1.3" go_router: dependency: "direct main" description: name: go_router sha256: "7c2d40b59890a929824f30d442e810116caf5088482629c894b9e4478c67472d" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "14.6.3" graphs: @@ -471,7 +471,7 @@ packages: description: name: graphs sha256: "741bbf84165310a68ff28fe9e727332eef1407342fca52759cb21ad8177bb8d0" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.2" hashcodes: @@ -479,7 +479,7 @@ packages: description: name: hashcodes sha256: "80f9410a5b3c8e110c4b7604546034749259f5d6dcca63e0d3c17c9258f1a651" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" http: @@ -487,7 +487,7 @@ packages: description: name: http sha256: fe7ab022b76f3034adc518fb6ea04a82387620e19977665ea18d30a1cf43442f - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" http_multi_server: @@ -495,7 +495,7 @@ packages: description: name: http_multi_server sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.2.2" http_parser: @@ -503,7 +503,7 @@ packages: description: name: http_parser sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.2" i_app_services: @@ -518,7 +518,7 @@ packages: description: name: image_size_getter sha256: "9a299e3af2ebbcfd1baf21456c3c884037ff524316c97d8e56035ea8fdf35653" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.0" intl: @@ -526,7 +526,7 @@ packages: description: name: intl sha256: d6f56758b7d3014a48af9701c085700aac781a92a87a62b1333b46d8879661cf - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.19.0" io: @@ -534,7 +534,7 @@ packages: description: name: io sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.5" js: @@ -542,7 +542,7 @@ packages: description: name: js sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.6.7" json_annotation: @@ -550,7 +550,7 @@ packages: description: name: json_annotation sha256: "1ce844379ca14835a50d2f019a3099f419082cfdd231cd86a142af94dd5c6bb1" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.9.0" leak_tracker: @@ -558,7 +558,7 @@ packages: description: name: leak_tracker sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "10.0.7" leak_tracker_flutter_testing: @@ -566,7 +566,7 @@ packages: description: name: leak_tracker_flutter_testing sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.8" leak_tracker_testing: @@ -574,7 +574,7 @@ packages: description: name: leak_tracker_testing sha256: "6ba465d5d76e67ddf503e1161d1f4a6bc42306f9d66ca1e8f079a47290fb06d3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.0.1" lints: @@ -582,7 +582,7 @@ packages: description: name: lints sha256: "0a217c6c989d21039f1498c3ed9f3ed71b354e69873f13a8dfc3c9fe76f1b452" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" logging: @@ -590,7 +590,7 @@ packages: description: name: logging sha256: c8245ada5f1717ed44271ed1c26b8ce85ca3228fd2ffdb75468ab01979309d61 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" lottie: @@ -598,7 +598,7 @@ packages: description: name: lottie sha256: c5fa04a80a620066c15cf19cc44773e19e9b38e989ff23ea32e5903ef1015950 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.3.1" macros: @@ -606,7 +606,7 @@ packages: description: name: macros sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.3-main.0" matcher: @@ -614,7 +614,7 @@ packages: description: name: matcher sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.12.16+1" material_color_utilities: @@ -622,7 +622,7 @@ packages: description: name: material_color_utilities sha256: f7142bb1154231d7ea5f96bc7bde4bda2a0945d2806bb11670e30b850d56bdec - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.11.1" meta: @@ -630,7 +630,7 @@ packages: description: name: meta sha256: bdb68674043280c3428e9ec998512fb681678676b3c54e773629ffe74419f8c7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.15.0" mime: @@ -638,7 +638,7 @@ packages: description: name: mime sha256: "41a20518f0cb1256669420fdba0cd90d21561e560ac240f26ef8322e45bb7ed6" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.0" nested: @@ -646,7 +646,7 @@ packages: description: name: nested sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.0" package_config: @@ -654,7 +654,7 @@ packages: description: name: package_config sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" path: @@ -662,7 +662,7 @@ packages: description: name: path sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.9.0" path_parsing: @@ -670,7 +670,7 @@ packages: description: name: path_parsing sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" path_provider: @@ -678,7 +678,7 @@ packages: description: name: path_provider sha256: fec0d61223fba3154d87759e3cc27fe2c8dc498f6386c6d6fc80d1afdd1bf378 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" path_provider_android: @@ -686,7 +686,7 @@ packages: description: name: path_provider_android sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.15" path_provider_aurora: @@ -703,7 +703,7 @@ packages: description: name: path_provider_foundation sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.4.1" path_provider_linux: @@ -711,7 +711,7 @@ packages: description: name: path_provider_linux sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.2.1" path_provider_platform_interface: @@ -719,7 +719,7 @@ packages: description: name: path_provider_platform_interface sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" path_provider_windows: @@ -727,7 +727,7 @@ packages: description: name: path_provider_windows sha256: bd6f00dbd873bfb70d0761682da2b3a2c2fccc2b9e84c495821639601d81afe7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.3.0" petitparser: @@ -735,7 +735,7 @@ packages: description: name: petitparser sha256: c15605cd28af66339f8eb6fbe0e541bfe2d1b72d5825efc6598f3e0a31b9ad27 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.2" platform: @@ -743,7 +743,7 @@ packages: description: name: platform sha256: "5d6b1b0036a5f331ebc77c850ebc8506cbc1e9416c27e59b439f917a902a4984" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.6" plugin_platform_interface: @@ -751,7 +751,7 @@ packages: description: name: plugin_platform_interface sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.8" pointycastle: @@ -759,7 +759,7 @@ packages: description: name: pointycastle sha256: "4be0097fcf3fd3e8449e53730c631200ebc7b88016acecab2b0da2f0149222fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.9.1" pool: @@ -767,7 +767,7 @@ packages: description: name: pool sha256: "20fe868b6314b322ea036ba325e6fc0711a22948856475e2c2b6306e8ab39c2a" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.1" posix: @@ -775,7 +775,7 @@ packages: description: name: posix sha256: a0117dc2167805aa9125b82eee515cc891819bac2f538c83646d355b16f58b9a - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.0.1" provider: @@ -783,7 +783,7 @@ packages: description: name: provider sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.1.2" pub_semver: @@ -791,7 +791,7 @@ packages: description: name: pub_semver sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" pubspec_parse: @@ -799,7 +799,7 @@ packages: description: name: pubspec_parse sha256: "0560ba233314abbed0a48a2956f7f022cce7c3e1e73df540277da7544cad4082" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" recase: @@ -807,7 +807,7 @@ packages: description: name: recase sha256: e4eb4ec2dcdee52dcf99cb4ceabaffc631d7424ee55e56f280bc039737f89213 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "4.1.0" shelf: @@ -815,7 +815,7 @@ packages: description: name: shelf sha256: e7dd780a7ffb623c57850b33f43309312fc863fb6aa3d276a754bb299839ef12 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.2" shelf_web_socket: @@ -823,7 +823,7 @@ packages: description: name: shelf_web_socket sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.0.1" sky_engine: @@ -836,7 +836,7 @@ packages: description: name: source_gen sha256: "14658ba5f669685cd3d63701d01b31ea748310f7ab854e471962670abcf57832" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.5.0" source_span: @@ -844,7 +844,7 @@ packages: description: name: source_span sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.10.0" stack_trace: @@ -852,7 +852,7 @@ packages: description: name: stack_trace sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.12.0" stream_channel: @@ -860,7 +860,7 @@ packages: description: name: stream_channel sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.2" stream_transform: @@ -868,7 +868,7 @@ packages: description: name: stream_transform sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.1" string_scanner: @@ -876,7 +876,7 @@ packages: description: name: string_scanner sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.3.0" term_glyph: @@ -884,7 +884,7 @@ packages: description: name: term_glyph sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.2.1" test_api: @@ -892,7 +892,7 @@ packages: description: name: test_api sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.7.3" time: @@ -900,7 +900,7 @@ packages: description: name: time sha256: "370572cf5d1e58adcb3e354c47515da3f7469dac3a95b447117e728e7be6f461" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.5" timing: @@ -908,7 +908,7 @@ packages: description: name: timing sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.0.2" typed_data: @@ -916,7 +916,7 @@ packages: description: name: typed_data sha256: f9049c039ebfeb4cf7a7104a675823cd72dba8297f264b6637062516699fa006 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.4.0" vector_graphics: @@ -924,7 +924,7 @@ packages: description: name: vector_graphics sha256: "44cc7104ff32563122a929e4620cf3efd584194eec6d1d913eb5ba593dbcf6de" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.18" vector_graphics_codec: @@ -932,7 +932,7 @@ packages: description: name: vector_graphics_codec sha256: "99fd9fbd34d9f9a32efd7b6a6aae14125d8237b10403b422a6a6dfeac2806146" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.13" vector_graphics_compiler: @@ -940,7 +940,7 @@ packages: description: name: vector_graphics_compiler sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.16" vector_math: @@ -948,7 +948,7 @@ packages: description: name: vector_math sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "2.1.4" vm_service: @@ -956,7 +956,7 @@ packages: description: name: vm_service sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "14.3.0" watcher: @@ -964,7 +964,7 @@ packages: description: name: watcher sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.1" web: @@ -972,7 +972,7 @@ packages: description: name: web sha256: cd3543bd5798f6ad290ea73d210f423502e71900302dde696f8bff84bf89a1cb - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" web_socket: @@ -980,23 +980,23 @@ packages: description: name: web_socket sha256: "3c12d96c0c9a4eec095246debcea7b86c0324f22df69893d538fcc6f1b8cce83" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "0.1.6" web_socket_channel: dependency: transitive description: name: web_socket_channel - sha256: "9f187088ed104edd8662ca07af4b124465893caf063ba29758f97af57e61da8f" - url: "https://pub.dev" + sha256: "0b8e2457400d8a859b7b2030786835a28a8e80836ef64402abef392ff4f1d0e5" + url: "https://pub.flutter-io.cn" source: hosted - version: "3.0.1" + version: "3.0.2" xdg_directories: dependency: transitive description: name: xdg_directories sha256: "7a3f37b05d989967cdddcbb571f1ea834867ae2faa29725fd085180e0883aa15" - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "1.1.0" xml: @@ -1004,7 +1004,7 @@ packages: description: name: xml sha256: b015a8ad1c488f66851d762d3090a21c600e479dc75e68328c52774040cf9226 - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "6.5.0" yaml: @@ -1012,7 +1012,7 @@ packages: description: name: yaml sha256: b9da305ac7c39faa3f030eccd175340f968459dae4af175130b3fc47e40d76ce - url: "https://pub.dev" + url: "https://pub.flutter-io.cn" source: hosted version: "3.1.3" sdks: diff --git a/pubspec.yaml b/pubspec.yaml index 3e98cbb..1fe5858 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -32,6 +32,7 @@ dependencies: ### Аврора реализация ### path: app_services/aurora/app_services + equatable: ^2.0.7 dev_dependencies: flutter_test: