mirror of
https://github.com/smmarty/friflex_flutter_starter.git
synced 2025-12-21 17:10:45 +00:00
chore(app): обновление flutter и пакетов (#38)
* chore(pubspec,di): Обновить версии SDK и исправить использование AppEnv * chore(readme): Обновить версии Flutter и Dart, добавить новые библиотеки --------- Co-authored-by: petrovyuri <petrovyuri@example.com>
This commit is contained in:
64
.cursorrules
Normal file
64
.cursorrules
Normal file
@@ -0,0 +1,64 @@
|
||||
# Правила для Cursor AI
|
||||
|
||||
## Соглашение о коммитах
|
||||
|
||||
При генерации сообщений коммитов ВСЕГДА используй следующий формат:
|
||||
`<тип>(<контекст1>,<контекст2>,...): <короткое описание>`
|
||||
|
||||
Для Pull Request формат:
|
||||
`<тип>(<контекст1>,<контекст2>,...): <короткое описание>`
|
||||
|
||||
Где:
|
||||
- `<тип>` - тип коммита (см. ниже)
|
||||
- `<контекст>` - модули/компоненты, которые изменяются (можно указать несколько через запятую)
|
||||
- `<короткое описание>` - краткое описание изменений на русском языке
|
||||
|
||||
### Типы коммитов согласно convention:
|
||||
|
||||
- **feat** - новая функция
|
||||
- **fix** - исправление ошибок
|
||||
- **refactor** - изменение кода, которое не исправляет ошибку и не добавляет функции (рефакторинг кода)
|
||||
- **build** - изменения, влияющие на систему сборки или внешние зависимости (примеры областей: android, ios, linux и так далее)
|
||||
- **docs** - изменения только в документации
|
||||
- **chore** - добавление/обновление/настройка инструментов и библиотек (пример: pubspec.yaml)
|
||||
- **test** - добавление недостающих тестов или исправление существующих тестов
|
||||
- **ci** - изменения в файлах конфигурации и скриптах CI (примеры областей: папка CI)
|
||||
|
||||
### Контекст (scope):
|
||||
|
||||
Указывай модуль или компонент, который изменяется. Можно указать несколько через запятую:
|
||||
- `app` - основное приложение
|
||||
- `di` - dependency injection
|
||||
- `auth` - аутентификация
|
||||
- `api` - API endpoints
|
||||
- `db` - база данных
|
||||
- `config` - конфигурация
|
||||
- `i18n` - интернационализация
|
||||
- `scripts` - скрипты
|
||||
- `pubspec` - зависимости проекта
|
||||
- `android`, `ios`, `linux` - платформы
|
||||
- другие модули проекта
|
||||
|
||||
### Примеры правильных коммитов:
|
||||
|
||||
- `feat(app,di,auth): Добавить локальный репозиторий`
|
||||
- `fix(api): Исправить валидацию запросов`
|
||||
- `docs(i18n): Обновить руководство по генерации`
|
||||
- `refactor(handler): Оптимизировать обработку запросов`
|
||||
- `test(security): Добавить тесты для rate limiter`
|
||||
- `chore(pubspec): Обновить зависимости`
|
||||
|
||||
## Язык
|
||||
|
||||
- Всегда отвечай на русском языке
|
||||
- Коммиты пиши на русском языке
|
||||
- Документацию веди на русском языке
|
||||
- Язык описания PR - Русский
|
||||
|
||||
## Стиль кода
|
||||
|
||||
- Следуй Dart/Flutter conventions
|
||||
- Используй осмысленные имена переменных и функций
|
||||
- Добавляй комментарии к публичным функциям
|
||||
- Группируй импорты (стандартные, внешние, внутренние)
|
||||
|
||||
24
README.md
24
README.md
@@ -1,8 +1,8 @@
|
||||
|
||||
# 🚀 Friflex Flutter Starter - Корпоративный шаблон
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
Корпоративный стартовый шаблон для разработки масштабируемых Flutter-приложений
|
||||
@@ -24,6 +24,7 @@
|
||||
- 🌍 Поддержка интернационализации
|
||||
- 🎨 UI Kit и система токенов дизайна
|
||||
- 🔍 Инструменты отладки и мониторинга
|
||||
- ⚡ Современный Dart 3.10+ с dot shorthands
|
||||
|
||||
## 🎯 Для чего нужен стартер
|
||||
|
||||
@@ -90,20 +91,27 @@ features/
|
||||
|
||||
| Категория | Библиотека | Версия | Описание |
|
||||
|-----------|------------|--------|----------|
|
||||
| 🧭 **Навигация** | [go_router](https://pub.dev/packages/go_router) | `16.2.4` | Декларативный роутинг |
|
||||
| 🧭 **Навигация** | [go_router](https://pub.dev/packages/go_router) | `17.0.0` | Декларативный роутинг |
|
||||
| 🔄 **State Management** | [flutter_bloc](https://pub.dev/packages/flutter_bloc) | `9.1.1` | Управление состоянием |
|
||||
| 💉 **DI** | Custom InheritedWidget | - | Внедрение зависимостей |
|
||||
| 🎨 **Resources** | [flutter_gen](https://pub.dev/packages/flutter_gen) | `5.12.0` | Генерация ресурсов |
|
||||
| 🌐 **HTTP** | [dio](https://pub.dev/packages/dio) | `5.9.0` | HTTP клиент |
|
||||
| 🎨 **SVG** | [flutter_svg](https://pub.dev/packages/flutter_svg) | `2.2.2` | Поддержка SVG |
|
||||
| 🎬 **Animation** | [lottie](https://pub.dev/packages/lottie) | `3.3.2` | Анимации Lottie |
|
||||
| 🔒 **Secure Storage** | [flutter_secure_storage](https://pub.dev/packages/flutter_secure_storage) | - | Защищенное хранилище |
|
||||
| 📊 **Logging** | [talker](https://pub.dev/packages/talker_flutter) | `5.0.1` | Логирование и отладка |
|
||||
| 📊 **Logging** | [talker](https://pub.dev/packages/talker_flutter) | `5.0.2` | Логирование и отладка |
|
||||
| 🎨 **Theme** | [theme_tailor](https://pub.dev/packages/theme_tailor) | `3.1.1` | Генерация тем |
|
||||
| ⚙️ **Environment** | [envied](https://pub.dev/packages/envied) | `1.3.1` | Управление переменными окружения |
|
||||
|
||||
### 🔧 Инструменты разработки
|
||||
|
||||
- **📝 Линтинг**: корпоративные правила кода
|
||||
- **🏗️ Code Generation**: `build_runner` для генерации кода
|
||||
- **🌍 Локализация**: `flutter_localizations` + `intl`
|
||||
- **⚙️ Окружения**: `envied` для управления переменными
|
||||
| Инструмент | Версия | Описание |
|
||||
|-----------|--------|----------|
|
||||
| **📝 Линтинг** | `flutter_lints: 6.0.0` | Корпоративные правила кода |
|
||||
| **🏗️ Code Generation** | `build_runner: 2.10.3` | Генерация кода |
|
||||
| **🌍 Локализация** | `intl: 0.20.2` | Интернационализация |
|
||||
| **⚙️ Environment** | `envied: 1.3.1` + `envied_generator: 1.3.1` | Управление переменными окружения |
|
||||
| **🎨 Theme Generator** | `theme_tailor: 3.1.1` | Генерация тем |
|
||||
|
||||
## 🗂️ Структура проекта
|
||||
|
||||
|
||||
@@ -10,7 +10,6 @@ import 'package:friflex_starter/features/error/error_screen.dart';
|
||||
import 'package:friflex_starter/features/splash/splash_screen.dart';
|
||||
import 'package:friflex_starter/features/update/domain/state/cubit/update_cubit.dart';
|
||||
import 'package:friflex_starter/features/update/update_routes.dart';
|
||||
import 'package:friflex_starter/features/update/update_type.dart';
|
||||
import 'package:friflex_starter/l10n/gen/app_localizations.dart';
|
||||
import 'package:friflex_starter/l10n/localization_notifier.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
@@ -124,7 +123,7 @@ class _App extends StatelessWidget {
|
||||
child: BlocConsumer<UpdateCubit, UpdateState>(
|
||||
listener: (context, state) {
|
||||
if (state is UpdateSuccessState &&
|
||||
state.updateInfo.updateType == UpdateType.hard &&
|
||||
state.updateInfo.updateType == .hard &&
|
||||
context.mounted) {
|
||||
router.goNamed(UpdateRoutes.hardUpdateScreenName);
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ class AppConfigDev implements IAppConfig {
|
||||
AppConfigDev();
|
||||
|
||||
@override
|
||||
AppEnv get env => AppEnv.dev;
|
||||
AppEnv get env => .dev;
|
||||
|
||||
@override
|
||||
String get name => 'AppConfigDev';
|
||||
@@ -67,7 +67,7 @@ class AppConfigProd implements IAppConfig {
|
||||
AppConfigProd();
|
||||
|
||||
@override
|
||||
AppEnv get env => AppEnv.prod;
|
||||
AppEnv get env => .prod;
|
||||
|
||||
@override
|
||||
String get name => 'AppConfigProd';
|
||||
@@ -93,7 +93,7 @@ class AppConfigStage implements IAppConfig {
|
||||
AppConfigStage();
|
||||
|
||||
@override
|
||||
AppEnv get env => AppEnv.stage;
|
||||
AppEnv get env => .stage;
|
||||
|
||||
@override
|
||||
String get name => 'AppConfigStage';
|
||||
|
||||
@@ -50,7 +50,7 @@ class AppColors extends ThemeExtension<AppColors> with _$AppColorsTailorMixin {
|
||||
testColor: Colors.red,
|
||||
errorSnackbarBackground: Color(0xFFD24720),
|
||||
successSnackbarBackground: Color(0xFF6FB62C),
|
||||
infoSnackbarBackground: Color.fromARGB(255, 220, 108, 77),
|
||||
infoSnackbarBackground: .fromARGB(255, 220, 108, 77),
|
||||
itemTextColor: Color(0xFFFAF3EB),
|
||||
);
|
||||
|
||||
@@ -59,7 +59,7 @@ class AppColors extends ThemeExtension<AppColors> with _$AppColorsTailorMixin {
|
||||
testColor: Colors.green,
|
||||
errorSnackbarBackground: Color(0xFF638B8B),
|
||||
successSnackbarBackground: Color(0xFF93C499),
|
||||
infoSnackbarBackground: Color.fromARGB(255, 35, 147, 178),
|
||||
infoSnackbarBackground: .fromARGB(255, 35, 147, 178),
|
||||
itemTextColor: Colors.white,
|
||||
);
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ class AppSnackBar extends StatefulWidget {
|
||||
_show(
|
||||
context: context,
|
||||
message: message,
|
||||
type: TypeSnackBar.error,
|
||||
type: .error,
|
||||
displayDuration: displayDuration,
|
||||
);
|
||||
}
|
||||
@@ -81,7 +81,7 @@ class AppSnackBar extends StatefulWidget {
|
||||
_show(
|
||||
context: context,
|
||||
message: message,
|
||||
type: TypeSnackBar.info,
|
||||
type: .info,
|
||||
displayDuration: displayDuration,
|
||||
);
|
||||
}
|
||||
@@ -99,7 +99,7 @@ class AppSnackBar extends StatefulWidget {
|
||||
_show(
|
||||
context: context,
|
||||
message: message,
|
||||
type: TypeSnackBar.success,
|
||||
type: .success,
|
||||
displayDuration: displayDuration,
|
||||
);
|
||||
}
|
||||
@@ -266,9 +266,9 @@ class _AppSnackBarState extends State<AppSnackBar>
|
||||
/// [TypeSnackBar.error] - цвет ошибки
|
||||
Color _getBackgroundColor(TypeSnackBar type) {
|
||||
return switch (type) {
|
||||
TypeSnackBar.success => context.appColors.successSnackbarBackground,
|
||||
TypeSnackBar.error => context.appColors.errorSnackbarBackground,
|
||||
TypeSnackBar.info => context.appColors.infoSnackbarBackground,
|
||||
.success => context.appColors.successSnackbarBackground,
|
||||
.error => context.appColors.errorSnackbarBackground,
|
||||
.info => context.appColors.infoSnackbarBackground,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -290,17 +290,17 @@ class _Icon extends StatelessWidget {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return switch (type) {
|
||||
TypeSnackBar.success => const Icon(
|
||||
.success => const Icon(
|
||||
Icons.check_circle,
|
||||
color: Colors.white,
|
||||
size: 32,
|
||||
),
|
||||
TypeSnackBar.error => const Icon(
|
||||
.error => const Icon(
|
||||
Icons.error,
|
||||
color: Colors.white,
|
||||
size: 32,
|
||||
),
|
||||
TypeSnackBar.info => const Icon(
|
||||
.info => const Icon(
|
||||
Icons.info,
|
||||
color: Colors.white,
|
||||
size: 32,
|
||||
|
||||
@@ -41,9 +41,9 @@ final class DiContainer {
|
||||
}) async {
|
||||
// Инициализация конфигурации приложения
|
||||
appConfig = switch (env) {
|
||||
AppEnv.dev => AppConfigDev(),
|
||||
AppEnv.prod => AppConfigProd(),
|
||||
AppEnv.stage => AppConfigStage(),
|
||||
.dev => AppConfigDev(),
|
||||
.prod => AppConfigProd(),
|
||||
.stage => AppConfigStage(),
|
||||
};
|
||||
|
||||
// Инициализация HTTP клиента
|
||||
|
||||
@@ -155,9 +155,9 @@ final class DiRepositories {
|
||||
}) {
|
||||
try {
|
||||
final repo = switch (environment) {
|
||||
AppEnv.dev => mockFactory(),
|
||||
AppEnv.prod => mainFactory(),
|
||||
AppEnv.stage =>
|
||||
.dev => mockFactory(),
|
||||
.prod => mainFactory(),
|
||||
.stage =>
|
||||
_mockReposToSwitch.contains(T) ? mockFactory() : mainFactory(),
|
||||
};
|
||||
|
||||
|
||||
@@ -6,7 +6,6 @@ import 'package:friflex_starter/app/ui_kit/app_snackbar.dart';
|
||||
import 'package:friflex_starter/features/update/domain/state/cubit/update_cubit.dart';
|
||||
import 'package:friflex_starter/features/update/presentation/components/soft_modal_sheet.dart';
|
||||
import 'package:friflex_starter/features/update/update_routes.dart';
|
||||
import 'package:friflex_starter/features/update/update_type.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
@@ -79,7 +78,7 @@ class _ComponentsScreenState extends State<ComponentsScreen> {
|
||||
onPressed: () {
|
||||
final updateCubitState = context.read<UpdateCubit>().state;
|
||||
if (updateCubitState is UpdateSuccessState &&
|
||||
updateCubitState.updateInfo.updateType == UpdateType.soft) {
|
||||
updateCubitState.updateInfo.updateType == .soft) {
|
||||
unawaited(
|
||||
SoftUpdateModal.show(
|
||||
context,
|
||||
|
||||
@@ -3,11 +3,9 @@ import 'dart:async';
|
||||
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/app/app_env.dart';
|
||||
import 'package:friflex_starter/features/debug/debug_routes.dart';
|
||||
import 'package:friflex_starter/features/update/domain/state/cubit/update_cubit.dart';
|
||||
import 'package:friflex_starter/features/update/presentation/components/soft_modal_sheet.dart';
|
||||
import 'package:friflex_starter/features/update/update_type.dart';
|
||||
import 'package:go_router/go_router.dart';
|
||||
|
||||
/// {@template root_screen}
|
||||
@@ -47,7 +45,7 @@ class _RootScreenState extends State<RootScreen> {
|
||||
|
||||
// Проверяем только состояние успеха с доступной информацией об обновлении
|
||||
if (updateState is UpdateSuccessState &&
|
||||
updateState.updateInfo.updateType == UpdateType.soft) {
|
||||
updateState.updateInfo.updateType == .soft) {
|
||||
unawaited(
|
||||
SoftUpdateModal.show(
|
||||
context,
|
||||
@@ -64,7 +62,7 @@ class _RootScreenState extends State<RootScreen> {
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
floatingActionButton: context.di.env != AppEnv.prod
|
||||
floatingActionButton: context.di.env != .prod
|
||||
? FloatingActionButton(
|
||||
child: const Icon(Icons.bug_report),
|
||||
onPressed: () {
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
import 'package:friflex_starter/features/update/domain/entity/update_entity.dart';
|
||||
import 'package:friflex_starter/features/update/domain/repository/i_update_repository.dart';
|
||||
import 'package:friflex_starter/features/update/update_type.dart';
|
||||
|
||||
/// Мок обновления обязательное, можно использовать для тестирования
|
||||
const mockHardUpdateEntity = UpdateEntity(
|
||||
availableVersion: '2.0.0',
|
||||
updateUrl: 'https://example.com/update',
|
||||
updateType: UpdateType.hard,
|
||||
updateType: .hard,
|
||||
whatIsNew: 'Добавлены новые функции и исправлены ошибки.',
|
||||
);
|
||||
|
||||
@@ -14,7 +13,7 @@ const mockHardUpdateEntity = UpdateEntity(
|
||||
const mockSoftUpdateEntity = UpdateEntity(
|
||||
availableVersion: '2.0.0',
|
||||
updateUrl: 'https://example.com/update',
|
||||
updateType: UpdateType.soft,
|
||||
updateType: .soft,
|
||||
whatIsNew: 'Добавлены новые функции и исправлены ошибки.',
|
||||
);
|
||||
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/runner/app_runner.dart';
|
||||
|
||||
void main() => AppRunner(AppEnv.prod).run();
|
||||
void main() => AppRunner(.prod).run();
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/runner/app_runner.dart';
|
||||
|
||||
void main() => AppRunner(AppEnv.dev).run();
|
||||
void main() => AppRunner(.dev).run();
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/runner/app_runner.dart';
|
||||
|
||||
void main() => AppRunner(AppEnv.prod).run();
|
||||
void main() => AppRunner(.prod).run();
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
import 'package:friflex_starter/app/app_env.dart';
|
||||
import 'package:friflex_starter/runner/app_runner.dart';
|
||||
|
||||
void main() => AppRunner(AppEnv.stage).run();
|
||||
void main() => AppRunner(.stage).run();
|
||||
|
||||
@@ -1273,5 +1273,5 @@ packages:
|
||||
source: hosted
|
||||
version: "3.1.3"
|
||||
sdks:
|
||||
dart: ">=3.9.2 <4.0.0"
|
||||
flutter: ">=3.35.5"
|
||||
dart: ">=3.10.0 <4.0.0"
|
||||
flutter: ">=3.38.1"
|
||||
|
||||
@@ -6,8 +6,8 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev
|
||||
version: 0.0.1+1
|
||||
|
||||
environment:
|
||||
sdk: ^3.9.2
|
||||
flutter: ">=3.35.5"
|
||||
sdk: ">=3.10.0 <4.0.0"
|
||||
flutter: ">=3.38.1"
|
||||
|
||||
dependencies:
|
||||
flutter:
|
||||
|
||||
Reference in New Issue
Block a user