feature(statistick): Основная верстка экрана статистики

This commit is contained in:
2025-06-17 20:56:48 +03:00
parent 5e65118ab4
commit 1a0ecee501
15 changed files with 308 additions and 11 deletions

View File

@@ -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,

View File

@@ -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"]!),
);
},
);
}
}