feature(statistick): Основная верстка экрана статистики
This commit is contained in:
@@ -103,6 +103,11 @@ class Bold14px extends TypographyTypeBold {
|
||||
double get size => 14;
|
||||
}
|
||||
|
||||
class Bold24px extends TypographyTypeBold {
|
||||
@override
|
||||
double get size => 24;
|
||||
}
|
||||
|
||||
class Bold34px extends TypographyTypeBold {
|
||||
@override
|
||||
double get size => 34;
|
||||
|
||||
@@ -61,6 +61,29 @@ class $AssetsIconsGen {
|
||||
AssetGenImage get settingsTrash =>
|
||||
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
|
||||
AssetGenImage get typeArrowDown =>
|
||||
const AssetGenImage('assets/icons/type=arrow_down.png');
|
||||
@@ -271,6 +294,12 @@ class $AssetsIconsGen {
|
||||
settingsProfile,
|
||||
settingsShare,
|
||||
settingsTrash,
|
||||
statsBest,
|
||||
statsCard,
|
||||
statsDown,
|
||||
statsRepeat,
|
||||
statsTime,
|
||||
statsUp,
|
||||
typeArrowDown,
|
||||
typeBack,
|
||||
typeBold,
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
/// Locales: 2
|
||||
/// 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
|
||||
// ignore_for_file: type=lint, unused_import
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
// ignore_for_file: no_leading_underscores_for_library_prefixes
|
||||
import 'package:auto_route/auto_route.dart' as _i13;
|
||||
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/screens/auth/auth_screen.dart' as _i1;
|
||||
import 'package:remever/screens/collections/collection_detail_screen.dart'
|
||||
@@ -366,16 +367,34 @@ class SplashRoute extends _i13.PageRouteInfo<void> {
|
||||
|
||||
/// generated route for
|
||||
/// [_i12.StatistickScreen]
|
||||
class StatistickRoute extends _i13.PageRouteInfo<void> {
|
||||
const StatistickRoute({List<_i13.PageRouteInfo>? children})
|
||||
: super(StatistickRoute.name, initialChildren: children);
|
||||
class StatistickRoute extends _i13.PageRouteInfo<StatistickRouteArgs> {
|
||||
StatistickRoute({_i16.Key? key, List<_i13.PageRouteInfo>? children})
|
||||
: super(
|
||||
StatistickRoute.name,
|
||||
args: StatistickRouteArgs(key: key),
|
||||
initialChildren: children,
|
||||
);
|
||||
|
||||
static const String name = 'StatistickRoute';
|
||||
|
||||
static _i13.PageInfo page = _i13.PageInfo(
|
||||
name,
|
||||
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}';
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import 'package:remever/components/extensions/context.dart';
|
||||
import 'package:remever/gen/assets.gen.dart';
|
||||
import 'package:remever/screens/settings/cubit/settings_cubit.dart';
|
||||
import 'package:remever/widgets/primary_button.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
class AboutSettingsState extends StatelessWidget {
|
||||
const AboutSettingsState({super.key});
|
||||
@@ -32,8 +33,8 @@ class AboutSettingsState extends StatelessWidget {
|
||||
),
|
||||
actions: <Widget>[
|
||||
IconButton(
|
||||
onPressed: () {
|
||||
showInfoToast('тут будет sharing');
|
||||
onPressed: () async {
|
||||
await Share.share('Присоединяйся к нам в REMEVER');
|
||||
},
|
||||
icon: Assets.icons.settingsShare.image(height: 24.h, width: 24.w),
|
||||
color: Colors.black,
|
||||
|
||||
@@ -1,12 +1,255 @@
|
||||
import 'package:auto_route/auto_route.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()
|
||||
class StatistickScreen extends StatelessWidget {
|
||||
const StatistickScreen({super.key});
|
||||
StatistickScreen({super.key});
|
||||
|
||||
final DateTime today = DateTime.now();
|
||||
|
||||
@override
|
||||
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),
|
||||
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),
|
||||
),
|
||||
],
|
||||
),
|
||||
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"},
|
||||
]),
|
||||
],
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
/// 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(),
|
||||
),
|
||||
),
|
||||
);
|
||||
return ListView.builder(
|
||||
shrinkWrap: true,
|
||||
physics: NeverScrollableScrollPhysics(),
|
||||
itemCount: data.length,
|
||||
itemBuilder: (context, index) {
|
||||
final item = data[index];
|
||||
return ListTile(
|
||||
title: Text(item["label"]!),
|
||||
trailing: Text(item["value"]!),
|
||||
);
|
||||
},
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user