145 lines
3.9 KiB
Dart
145 lines
3.9 KiB
Dart
import 'package:flutter/material.dart';
|
|
|
|
import 'package:arcx/app/app_theme.dart';
|
|
import 'package:arcx/features/stats/application/stats.dart';
|
|
|
|
class StatsCard extends StatelessWidget {
|
|
const StatsCard({super.key, required this.stats});
|
|
|
|
final StatsSummary stats;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
final hasData = stats.hasData;
|
|
return Card(
|
|
child: Padding(
|
|
padding: const EdgeInsets.all(16),
|
|
child: Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Row(
|
|
children: [
|
|
const Text(
|
|
'训练统计',
|
|
style: TextStyle(fontSize: 16, fontWeight: FontWeight.w600),
|
|
),
|
|
const Spacer(),
|
|
Text(
|
|
'今日',
|
|
style: TextStyle(fontSize: 13, color: AppTheme.textSecondary),
|
|
),
|
|
],
|
|
),
|
|
const SizedBox(height: 12),
|
|
_StatGrid(
|
|
items: [
|
|
_StatItem(
|
|
label: '今日射箭',
|
|
value: hasData ? '${stats.todayArrowCount}' : '-',
|
|
unit: '支',
|
|
),
|
|
_StatItem(
|
|
label: '今日消耗',
|
|
value: hasData ? stats.todayCalories.toStringAsFixed(1) : '-',
|
|
unit: '千卡',
|
|
),
|
|
_StatItem(
|
|
label: '运动强度',
|
|
value: hasData ? stats.todayIntensityLabel : '-',
|
|
unit: hasData
|
|
? stats.todayIntensityRaw.toStringAsFixed(1)
|
|
: '',
|
|
),
|
|
],
|
|
),
|
|
const Divider(height: 28),
|
|
_StatGrid(
|
|
items: [
|
|
_StatItem(
|
|
label: '训练天数',
|
|
value: hasData ? '${stats.trainingDays}' : '-',
|
|
unit: '天',
|
|
),
|
|
_StatItem(
|
|
label: '累计射箭',
|
|
value: hasData ? '${stats.totalArrowCount}' : '-',
|
|
unit: '支',
|
|
),
|
|
_StatItem(
|
|
label: '平均环数',
|
|
value: hasData ? stats.averageScoreLabel : '-',
|
|
unit: '环',
|
|
),
|
|
],
|
|
),
|
|
],
|
|
),
|
|
),
|
|
);
|
|
}
|
|
}
|
|
|
|
class _StatGrid extends StatelessWidget {
|
|
const _StatGrid({required this.items});
|
|
final List<_StatItem> items;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Row(
|
|
children: [
|
|
for (var i = 0; i < items.length; i++) ...[
|
|
Expanded(child: items[i]),
|
|
if (i < items.length - 1) const SizedBox(width: 8),
|
|
],
|
|
],
|
|
);
|
|
}
|
|
}
|
|
|
|
class _StatItem extends StatelessWidget {
|
|
const _StatItem({
|
|
required this.label,
|
|
required this.value,
|
|
required this.unit,
|
|
});
|
|
|
|
final String label;
|
|
final String value;
|
|
final String unit;
|
|
|
|
@override
|
|
Widget build(BuildContext context) {
|
|
return Column(
|
|
crossAxisAlignment: CrossAxisAlignment.start,
|
|
children: [
|
|
Text(
|
|
label,
|
|
style: TextStyle(fontSize: 12, color: AppTheme.textSecondary),
|
|
),
|
|
const SizedBox(height: 4),
|
|
Row(
|
|
crossAxisAlignment: CrossAxisAlignment.baseline,
|
|
textBaseline: TextBaseline.alphabetic,
|
|
children: [
|
|
Text(
|
|
value,
|
|
style: const TextStyle(
|
|
fontSize: 22,
|
|
fontWeight: FontWeight.w700,
|
|
color: AppTheme.primaryDark,
|
|
),
|
|
),
|
|
if (unit.isNotEmpty) ...[
|
|
const SizedBox(width: 2),
|
|
Text(
|
|
unit,
|
|
style: TextStyle(fontSize: 12, color: AppTheme.textSecondary),
|
|
),
|
|
],
|
|
],
|
|
),
|
|
],
|
|
);
|
|
}
|
|
}
|