refactor(full refactor): Рефакторинг стартера (#8)

This commit is contained in:
Yuri Petrov
2025-04-27 17:08:34 +03:00
committed by GitHub
parent 18eb7b1fe1
commit 5d7d29ecf8
206 changed files with 1065 additions and 20102 deletions

View File

@@ -0,0 +1,96 @@
import 'package:flutter/material.dart';
import 'package:friflex_starter/app/app_box.dart';
import 'package:friflex_starter/app/app_context_ext.dart';
import 'package:friflex_starter/features/debug/debug_routes.dart';
import 'package:go_router/go_router.dart';
class DebugScreen extends StatelessWidget {
const DebugScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Debug Screen')),
body: Center(
child: ListView(
padding: const EdgeInsets.all(16),
children: [
Text(
'Окружение: ${context.di.appConfig.env.name}',
),
const HBox(22),
Text(
'Реализация AppServices: ${context.di.services.secureStorage.nameImpl}',
),
const HBox(22),
ElevatedButton(
onPressed: () async {
await context.di.debugService.openDebugScreen(context);
},
child: const Text('Вызывать Экран отладки'),
),
const HBox(22),
const Text('Экраны для отладки:'),
const HBox(16),
ElevatedButton(
onPressed: () {
context.pushNamed(DebugRoutes.iconsScreenName);
},
child: const Text('Экран с иконками'),
),
const HBox(16),
ElevatedButton(
onPressed: () {
context.pushNamed(DebugRoutes.themeScreenName);
},
child: const Text('Экран настроек темы'),
),
const HBox(16),
ElevatedButton(
onPressed: () {
context.pushNamed(DebugRoutes.tokensScreenName);
},
child: const Text('Экран с токенами'),
),
const HBox(16),
ElevatedButton(
onPressed: () {
context.pushNamed(DebugRoutes.uiKitScreenName);
},
child: const Text('Экран UI Kit'),
),
const HBox(16),
ElevatedButton(
onPressed: () {
context.pushNamed(DebugRoutes.langScreenName);
},
child: const Text('Экран локализации'),
),
const HBox(22),
const Text('Имитирование ошибок:'),
const HBox(16),
ElevatedButton(
onPressed: () {
throw Exception(
'Тестовая ошибка Exception для отладки FlutterError',
);
},
child: const Text('Вызывать ошибку FlutterError'),
),
const HBox(16),
ElevatedButton(
onPressed: () async {
await _callError();
},
child: const Text('Вызывать ошибку PlatformDispatcher'),
),
],
),
),
);
}
Future<void> _callError() async {
throw Exception('Тестовая ошибка Exception для отладки PlatformDispatcher');
}
}

View File

@@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:friflex_starter/app/app_box.dart';
import 'package:friflex_starter/gen/assets.gen.dart';
/// {@template IconsScreen}
/// Экран для отрисовки иконок
/// {@endtemplate}
class IconsScreen extends StatelessWidget {
/// {@macro IconsScreen}
const IconsScreen({super.key});
@override
Widget build(BuildContext context) {
final iconList = Assets.icons.values
.map(
(icon) => _ItemIcon(icon: icon.svg(), name: icon.path),
)
.toList();
return Scaffold(
appBar: AppBar(title: const Text('Иконки')),
body: Center(
child: ListView.separated(
padding: const EdgeInsets.all(16),
itemBuilder: (context, index) {
return iconList[index];
},
separatorBuilder: (context, index) => const Divider(),
itemCount: iconList.length,
),
),
);
}
}
// Приватный класс для реализации элемента списка иконок
class _ItemIcon extends StatelessWidget {
/// Создает экземпляр элемента списка иконок
///
/// Принимает:
/// - [icon] - иконка
/// - [name] - название иконки
const _ItemIcon({required this.icon, required this.name});
/// Иконка
final Widget icon;
/// Название иконки
final String name;
@override
Widget build(BuildContext context) {
return Row(children: [icon, const WBox(16), Text(name)]);
}
}

View File

@@ -0,0 +1,65 @@
import 'package:flutter/material.dart';
import 'package:friflex_starter/app/app_context_ext.dart';
import 'package:friflex_starter/app/theme/app_colors_scheme.dart';
import 'package:friflex_starter/gen/assets.gen.dart';
import 'package:friflex_starter/gen/fonts.gen.dart';
/// {@template LangScreen}
/// Экран для отладки языков приложения
/// {@endtemplate}
class LangScreen extends StatelessWidget {
/// {@macro LangScreen}
const LangScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Lang')),
body: Center(
child: ListView(
padding: const EdgeInsets.all(16),
children: [
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
context.localization.changeLocal(
const Locale('ru', 'RU'),
);
},
child: const Text('Сменить язык на Rусский'),
),
const SizedBox(height: 16),
ElevatedButton(
onPressed: () {
context.localization.changeLocal(
const Locale('en', 'EN'),
);
},
child: const Text('Сменить язык на Английский'),
),
const SizedBox(height: 16),
Text(
'Тестовое слово bold: ${context.l10n.helloWorld}',
style: TextStyle(
color: context.colors.testColor,
fontFamily: Assets.fonts.montserratBold,
),
),
const SizedBox(height: 16),
Text(
'Тестовое слово medium: ${context.l10n.helloWorld}',
style: TextStyle(
color: context.colors.testColor,
fontFamily: FontFamily.montserrat,
),
),
const SizedBox(height: 16),
Text(
'Текущий язык: ${context.l10n.localeName}',
),
],
),
),
);
}
}

View File

@@ -0,0 +1,40 @@
import 'package:flutter/material.dart';
import 'package:friflex_starter/app/app_context_ext.dart';
import 'package:friflex_starter/app/theme/app_colors_scheme.dart';
/// {@template ThemeScreen}
/// Экран для отладки темы приложения
/// {@endtemplate}
class ThemeScreen extends StatelessWidget {
/// {@macro ThemeScreen}
const ThemeScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Theme')),
body: Center(
child: ListView(
padding: const EdgeInsets.all(16),
children: [
ElevatedButton(
onPressed: () {
context.theme.changeTheme();
},
child: const Text('Сменить тему'),
),
const SizedBox(height: 16),
ColoredBox(
color: context.colors.testColor,
child: const SizedBox(height: 100, width: 100),
),
const SizedBox(height: 16),
Text(
'Текущая тема: ${context.theme.themeMode}',
),
],
),
),
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
/// {@template TokensScreen}
/// Экран для отображения токенов
/// {@endtemplate}
class TokensScreen extends StatelessWidget {
/// {@macro TokensScreen}
const TokensScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Tokens')),
body: Center(
child: ListView(
padding: const EdgeInsets.all(16),
children: const [
Text(
'Access Token: ',
),
SizedBox(height: 16),
Text(
'Refresh Token: ',
),
SizedBox(height: 16),
],
),
),
);
}
}

View File

@@ -0,0 +1,31 @@
import 'package:flutter/material.dart';
/// {@template UiKitScreen}
/// Экран для отрисовки UI Kit
/// и тестирования его компонентов.
/// {@endtemplate}
class UiKitScreen extends StatelessWidget {
/// {@macro UiKitScreen}
const UiKitScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('UI Kit Screen'),
),
body: Center(
child: ListView(
padding: const EdgeInsets.all(16),
children: const [
Text(
'UI Kit Screen',
),
SizedBox(height: 16),
// Здесь можно добавить другие компоненты UI Kit
],
),
),
);
}
}