Files
2026-08-08 10:57:54 +08:00

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