Feature: Добавлена верстка экрана статистики #6
@@ -1130,7 +1130,7 @@
|
|||||||
"languageVersion": "3.7"
|
"languageVersion": "3.7"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"generated": "2025-06-16T19:03:33.328096Z",
|
"generated": "2025-06-17T17:48:52.089260Z",
|
||||||
"generator": "pub",
|
"generator": "pub",
|
||||||
"generatorVersion": "3.7.0",
|
"generatorVersion": "3.7.0",
|
||||||
"flutterRoot": "file:///Users/vitalijnecitajlo/fvm/versions/3.29.0",
|
"flutterRoot": "file:///Users/vitalijnecitajlo/fvm/versions/3.29.0",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
BIN
assets/.DS_Store
vendored
BIN
assets/.DS_Store
vendored
Binary file not shown.
BIN
assets/icons/stats_best.png
Normal file
BIN
assets/icons/stats_best.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.7 KiB |
BIN
assets/icons/stats_card.png
Normal file
BIN
assets/icons/stats_card.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.0 KiB |
BIN
assets/icons/stats_down.png
Normal file
BIN
assets/icons/stats_down.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 397 B |
BIN
assets/icons/stats_repeat.png
Normal file
BIN
assets/icons/stats_repeat.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 764 B |
BIN
assets/icons/stats_time.png
Normal file
BIN
assets/icons/stats_time.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 1.1 KiB |
BIN
assets/icons/stats_up.png
Normal file
BIN
assets/icons/stats_up.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 429 B |
@@ -103,6 +103,11 @@ class Bold14px extends TypographyTypeBold {
|
|||||||
double get size => 14;
|
double get size => 14;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class Bold24px extends TypographyTypeBold {
|
||||||
|
@override
|
||||||
|
double get size => 24;
|
||||||
|
}
|
||||||
|
|
||||||
class Bold34px extends TypographyTypeBold {
|
class Bold34px extends TypographyTypeBold {
|
||||||
@override
|
@override
|
||||||
double get size => 34;
|
double get size => 34;
|
||||||
|
|||||||
@@ -61,6 +61,29 @@ class $AssetsIconsGen {
|
|||||||
AssetGenImage get settingsTrash =>
|
AssetGenImage get settingsTrash =>
|
||||||
const AssetGenImage('assets/icons/settings_trash.png');
|
const AssetGenImage('assets/icons/settings_trash.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_best.png
|
||||||
|
AssetGenImage get statsBest =>
|
||||||
|
const AssetGenImage('assets/icons/stats_best.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_card.png
|
||||||
|
AssetGenImage get statsCard =>
|
||||||
|
const AssetGenImage('assets/icons/stats_card.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_down.png
|
||||||
|
AssetGenImage get statsDown =>
|
||||||
|
const AssetGenImage('assets/icons/stats_down.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_repeat.png
|
||||||
|
AssetGenImage get statsRepeat =>
|
||||||
|
const AssetGenImage('assets/icons/stats_repeat.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_time.png
|
||||||
|
AssetGenImage get statsTime =>
|
||||||
|
const AssetGenImage('assets/icons/stats_time.png');
|
||||||
|
|
||||||
|
/// File path: assets/icons/stats_up.png
|
||||||
|
AssetGenImage get statsUp => const AssetGenImage('assets/icons/stats_up.png');
|
||||||
|
|
||||||
/// File path: assets/icons/type=arrow_down.png
|
/// File path: assets/icons/type=arrow_down.png
|
||||||
AssetGenImage get typeArrowDown =>
|
AssetGenImage get typeArrowDown =>
|
||||||
const AssetGenImage('assets/icons/type=arrow_down.png');
|
const AssetGenImage('assets/icons/type=arrow_down.png');
|
||||||
@@ -271,6 +294,12 @@ class $AssetsIconsGen {
|
|||||||
settingsProfile,
|
settingsProfile,
|
||||||
settingsShare,
|
settingsShare,
|
||||||
settingsTrash,
|
settingsTrash,
|
||||||
|
statsBest,
|
||||||
|
statsCard,
|
||||||
|
statsDown,
|
||||||
|
statsRepeat,
|
||||||
|
statsTime,
|
||||||
|
statsUp,
|
||||||
typeArrowDown,
|
typeArrowDown,
|
||||||
typeBack,
|
typeBack,
|
||||||
typeBold,
|
typeBold,
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
/// Locales: 2
|
/// Locales: 2
|
||||||
/// Strings: 20 (10 per locale)
|
/// Strings: 20 (10 per locale)
|
||||||
///
|
///
|
||||||
/// Built on 2025-06-16 at 19:03 UTC
|
/// Built on 2025-06-17 at 17:49 UTC
|
||||||
|
|
||||||
// coverage:ignore-file
|
// coverage:ignore-file
|
||||||
// ignore_for_file: type=lint, unused_import
|
// ignore_for_file: type=lint, unused_import
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||||
import 'package:auto_route/auto_route.dart' as _i13;
|
import 'package:auto_route/auto_route.dart' as _i13;
|
||||||
import 'package:flutter/cupertino.dart' as _i14;
|
import 'package:flutter/cupertino.dart' as _i14;
|
||||||
|
import 'package:flutter/material.dart' as _i16;
|
||||||
import 'package:remever/database/database.dart' as _i15;
|
import 'package:remever/database/database.dart' as _i15;
|
||||||
import 'package:remever/screens/auth/auth_screen.dart' as _i1;
|
import 'package:remever/screens/auth/auth_screen.dart' as _i1;
|
||||||
import 'package:remever/screens/collections/collection_detail_screen.dart'
|
import 'package:remever/screens/collections/collection_detail_screen.dart'
|
||||||
@@ -366,16 +367,34 @@ class SplashRoute extends _i13.PageRouteInfo<void> {
|
|||||||
|
|
||||||
/// generated route for
|
/// generated route for
|
||||||
/// [_i12.StatistickScreen]
|
/// [_i12.StatistickScreen]
|
||||||
class StatistickRoute extends _i13.PageRouteInfo<void> {
|
class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
|
||||||
const StatistickRoute({List<_i13.PageRouteInfo>? children})
|
StatistickRoute({_i16.Key? key, List<_i13.PageRouteInfo>? children})
|
||||||
: super(StatistickRoute.name, initialChildren: children);
|
: super(
|
||||||
|
StatistickRoute.name,
|
||||||
|
args: StatistickRouteArgs(key: key),
|
||||||
|
initialChildren: children,
|
||||||
|
);
|
||||||
|
|
||||||
static const String name = 'StatistickRoute';
|
static const String name = 'StatistickRoute';
|
||||||
|
|
||||||
static _i13.PageInfo page = _i13.PageInfo(
|
static _i13.PageInfo page = _i13.PageInfo(
|
||||||
name,
|
name,
|
||||||
builder: (data) {
|
builder: (data) {
|
||||||
return const _i12.StatistickScreen();
|
final args = data.argsAs<StatistickRouteArgs>(
|
||||||
|
orElse: () => const StatistickRouteArgs(),
|
||||||
|
);
|
||||||
|
return _i12.StatistickScreen(key: args.key);
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class StatistickRouteArgs {
|
||||||
|
const StatistickRouteArgs({this.key});
|
||||||
|
|
||||||
|
final _i16.Key? key;
|
||||||
|
|
||||||
|
@override
|
||||||
|
String toString() {
|
||||||
|
return 'StatistickRouteArgs{key: $key}';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -21,31 +21,24 @@ class HomeScreen extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
logger.logBuild('build home screen');
|
logger.logBuild('build home screen');
|
||||||
|
|
||||||
return SafeArea(
|
return Stack(
|
||||||
top: false,
|
children: [
|
||||||
child: AutoTabsScaffold(
|
SafeArea(
|
||||||
routes: <PageRouteInfo>[
|
top: false,
|
||||||
SettingsRoute(),
|
child: AutoTabsScaffold(
|
||||||
StatistickRoute(),
|
routes: <PageRouteInfo>[
|
||||||
CreateRoute(),
|
SettingsRoute(),
|
||||||
CollectionRoute(),
|
StatistickRoute(),
|
||||||
],
|
CreateRoute(),
|
||||||
bottomNavigationBuilder: (_, TabsRouter tabsRouter) {
|
CollectionRoute(),
|
||||||
return ColoredBox(
|
],
|
||||||
color: AppColors.bg,
|
bottomNavigationBuilder: (_, TabsRouter tabsRouter) {
|
||||||
child: SizedBox(
|
return _buildBackgroundBar(tabsRouter);
|
||||||
height: 73.h,
|
},
|
||||||
child: Stack(
|
),
|
||||||
alignment: Alignment.bottomCenter,
|
),
|
||||||
children: <Widget>[
|
_buildCentralButton(),
|
||||||
_buildBackgroundBar(tabsRouter),
|
],
|
||||||
_buildCentralButton(),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
},
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -89,7 +82,7 @@ class HomeScreen extends StatelessWidget {
|
|||||||
/// Построение центральной кнопки
|
/// Построение центральной кнопки
|
||||||
Widget _buildCentralButton() {
|
Widget _buildCentralButton() {
|
||||||
return Align(
|
return Align(
|
||||||
alignment: Alignment.topCenter,
|
alignment: Alignment(0, 0.91),
|
||||||
child: GestureDetector(
|
child: GestureDetector(
|
||||||
onTap: () {
|
onTap: () {
|
||||||
// Логика нажатия на центральную кнопку
|
// Логика нажатия на центральную кнопку
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import 'package:remever/components/extensions/context.dart';
|
|||||||
import 'package:remever/gen/assets.gen.dart';
|
import 'package:remever/gen/assets.gen.dart';
|
||||||
import 'package:remever/screens/settings/cubit/settings_cubit.dart';
|
import 'package:remever/screens/settings/cubit/settings_cubit.dart';
|
||||||
import 'package:remever/widgets/primary_button.dart';
|
import 'package:remever/widgets/primary_button.dart';
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
|
||||||
class AboutSettingsState extends StatelessWidget {
|
class AboutSettingsState extends StatelessWidget {
|
||||||
const AboutSettingsState({super.key});
|
const AboutSettingsState({super.key});
|
||||||
@@ -32,8 +33,8 @@ class AboutSettingsState extends StatelessWidget {
|
|||||||
),
|
),
|
||||||
actions: <Widget>[
|
actions: <Widget>[
|
||||||
IconButton(
|
IconButton(
|
||||||
onPressed: () {
|
onPressed: () async {
|
||||||
showInfoToast('тут будет sharing');
|
await Share.share('Присоединяйся к нам в REMEVER');
|
||||||
},
|
},
|
||||||
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
|
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
|
||||||
color: Colors.black,
|
color: Colors.black,
|
||||||
|
|||||||
@@ -1,12 +1,247 @@
|
|||||||
import 'package:auto_route/auto_route.dart';
|
import 'package:auto_route/auto_route.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
|
import 'package:remever/common/resources.dart';
|
||||||
|
import 'package:remever/common/widgets/typography.dart';
|
||||||
|
import 'package:remever/common/widgets/wspace.dart';
|
||||||
|
import 'package:remever/components/extensions/context.dart';
|
||||||
|
import 'package:remever/gen/assets.gen.dart';
|
||||||
|
import 'package:share_plus/share_plus.dart';
|
||||||
|
import 'package:intl/intl.dart';
|
||||||
|
|
||||||
@RoutePage()
|
@RoutePage()
|
||||||
class StatistickScreen extends StatelessWidget {
|
class StatistickScreen extends StatelessWidget {
|
||||||
const StatistickScreen({super.key});
|
StatistickScreen({super.key});
|
||||||
|
|
||||||
|
final DateTime today = DateTime.now();
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return const Placeholder(color: Colors.orange);
|
return Scaffold(
|
||||||
|
backgroundColor: AppColors.bg,
|
||||||
|
appBar: _buildAppBar(context),
|
||||||
|
body: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(horizontal: 16).r,
|
||||||
|
child: SingleChildScrollView(
|
||||||
|
physics: BouncingScrollPhysics(),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.symmetric(vertical: 16).r,
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: AppColors.white,
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(12)).r,
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding:
|
||||||
|
const EdgeInsets.symmetric(horizontal: 12, vertical: 16).r,
|
||||||
|
child: Column(
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
|
children: [
|
||||||
|
Center(
|
||||||
|
child: AppTypography(
|
||||||
|
"Лучший результат за день",
|
||||||
|
type: Medium16px(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Center(
|
||||||
|
child: AppTypography(
|
||||||
|
DateFormat('dd.MM.yyyy').format(today),
|
||||||
|
type: Regular14px(),
|
||||||
|
color: AppColors.disabled,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildTodayStats(),
|
||||||
|
HSpace(32),
|
||||||
|
_buildSectionHeader(
|
||||||
|
"Повторили карточек",
|
||||||
|
Assets.icons.statsRepeat,
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildStatisticsList([
|
||||||
|
{"label": "За сегодня", "value": "77"},
|
||||||
|
{"label": "За эту неделю", "value": "188"},
|
||||||
|
{"label": "За прошлую неделю", "value": "33"},
|
||||||
|
{"label": "За последний месяц", "value": "1669"},
|
||||||
|
{"label": "За все время", "value": "1345669"},
|
||||||
|
]),
|
||||||
|
HSpace(32),
|
||||||
|
_buildSectionHeader(
|
||||||
|
"Всего изучено карточек",
|
||||||
|
Assets.icons.statsBest,
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildStatisticsList([
|
||||||
|
{"label": "За сегодня", "value": "77"},
|
||||||
|
{"label": "За эту неделю", "value": "188"},
|
||||||
|
{"label": "За прошлую неделю", "value": "33"},
|
||||||
|
{"label": "За последний месяц", "value": "1669"},
|
||||||
|
{"label": "За все время", "value": "1345669"},
|
||||||
|
]),
|
||||||
|
HSpace(32),
|
||||||
|
_buildSectionHeader(
|
||||||
|
"Прошли тренировок",
|
||||||
|
Assets.icons.statsTime,
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildStatisticsList([
|
||||||
|
{"label": "За сегодня", "value": "77"},
|
||||||
|
{"label": "За эту неделю", "value": "188"},
|
||||||
|
{"label": "За прошлую неделю", "value": "33"},
|
||||||
|
{"label": "За последний месяц", "value": "1669"},
|
||||||
|
{"label": "За все время", "value": "1345669"},
|
||||||
|
]),
|
||||||
|
HSpace(32),
|
||||||
|
_buildSectionHeader(
|
||||||
|
"Вырос уровень у карточек",
|
||||||
|
Assets.icons.statsUp,
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildStatisticsList([
|
||||||
|
{"label": "За сегодня", "value": "77"},
|
||||||
|
{"label": "За эту неделю", "value": "188"},
|
||||||
|
{"label": "За прошлую неделю", "value": "33"},
|
||||||
|
{"label": "За последний месяц", "value": "1669"},
|
||||||
|
{"label": "За все время", "value": "1345669"},
|
||||||
|
]),
|
||||||
|
HSpace(32),
|
||||||
|
_buildSectionHeader(
|
||||||
|
"Снизился уровень у карточек",
|
||||||
|
Assets.icons.statsDown,
|
||||||
|
),
|
||||||
|
HSpace(16),
|
||||||
|
_buildStatisticsList([
|
||||||
|
{"label": "За сегодня", "value": "77"},
|
||||||
|
{"label": "За эту неделю", "value": "188"},
|
||||||
|
{"label": "За прошлую неделю", "value": "33"},
|
||||||
|
{"label": "За последний месяц", "value": "1669"},
|
||||||
|
{"label": "За все время", "value": "1345669"},
|
||||||
|
]),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildTodayStats() {
|
||||||
|
return Row(
|
||||||
|
mainAxisAlignment: MainAxisAlignment.spaceBetween,
|
||||||
|
spacing: 8.r,
|
||||||
|
children: [
|
||||||
|
_buildStatBlock(
|
||||||
|
"230",
|
||||||
|
"повторили\nкарточек",
|
||||||
|
Color(0xFFD7E6F4),
|
||||||
|
Color(0xFF0058AB),
|
||||||
|
),
|
||||||
|
_buildStatBlock(
|
||||||
|
"19",
|
||||||
|
"прошли\nтренировок",
|
||||||
|
Color(0xFFFFE4E6),
|
||||||
|
Color(0xFFFF5C69),
|
||||||
|
),
|
||||||
|
_buildStatBlock(
|
||||||
|
"196",
|
||||||
|
"вырос\nуровень",
|
||||||
|
Color(0xFFD7F4EA),
|
||||||
|
Color(0xFF008456),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// AppBar экрана настроек
|
||||||
|
AppBar _buildAppBar(BuildContext context) {
|
||||||
|
return AppBar(
|
||||||
|
toolbarHeight: 66.h,
|
||||||
|
backgroundColor: AppColors.white,
|
||||||
|
shadowColor: Colors.transparent,
|
||||||
|
centerTitle: true,
|
||||||
|
leadingWidth: 0,
|
||||||
|
title: AppTypography('Статистика', type: SemiBold20px()),
|
||||||
|
actions: [
|
||||||
|
IconButton(
|
||||||
|
onPressed: () => Share.share('Зацени мою статистику в REMEVER'),
|
||||||
|
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
|
||||||
|
color: Colors.black,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Вспомогательные методы
|
||||||
|
|
||||||
|
Widget _buildStatBlock(
|
||||||
|
String value,
|
||||||
|
String label,
|
||||||
|
Color color,
|
||||||
|
Color textColor,
|
||||||
|
) {
|
||||||
|
return Expanded(
|
||||||
|
child: Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
color: color,
|
||||||
|
borderRadius: BorderRadius.circular(12).r,
|
||||||
|
),
|
||||||
|
padding: EdgeInsets.all(12).r,
|
||||||
|
child: Column(
|
||||||
|
children: [
|
||||||
|
AppTypography(value, type: Bold24px(), color: textColor),
|
||||||
|
AppTypography(
|
||||||
|
label,
|
||||||
|
type: Regular12px(),
|
||||||
|
color: textColor,
|
||||||
|
maxLines: 2,
|
||||||
|
textAlign: TextAlign.center,
|
||||||
|
),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildSectionHeader(String title, AssetGenImage icon) {
|
||||||
|
return Row(
|
||||||
|
children: [
|
||||||
|
icon.image(height: 20.h, width: 20.w),
|
||||||
|
WSpace(4),
|
||||||
|
AppTypography(title, type: Medium16px()),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
Widget _buildStatisticsList(List<Map<String, String>> data) {
|
||||||
|
return Container(
|
||||||
|
decoration: BoxDecoration(
|
||||||
|
borderRadius: BorderRadius.all(Radius.circular(12)).r,
|
||||||
|
color: AppColors.bg,
|
||||||
|
),
|
||||||
|
child: Padding(
|
||||||
|
padding: const EdgeInsets.all(12).r,
|
||||||
|
child: Column(
|
||||||
|
spacing: 8.r,
|
||||||
|
children:
|
||||||
|
data
|
||||||
|
.map(
|
||||||
|
(e) => Row(
|
||||||
|
children: [
|
||||||
|
Expanded(
|
||||||
|
child: AppTypography(
|
||||||
|
e['label']!,
|
||||||
|
type: Regular16px(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
Assets.icons.statsCard.image(height: 18.h, width: 18.w),
|
||||||
|
AppTypography(e["value"]!, type: Regular16px()),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.toList(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user