This commit is contained in:
ytc1012
2025-11-27 18:30:49 +08:00
parent 15252dfd88
commit ef44d11c32
4 changed files with 215 additions and 190 deletions

View File

@@ -41,130 +41,124 @@ class SessionDetailScreen extends StatelessWidget {
return Scaffold(
backgroundColor: AppColors.background,
appBar: AppBar(
title: const Text('会话详情'),
title: Text(l10n.history),
backgroundColor: AppColors.background,
),
body: SafeArea(
child: Padding(
child: SingleChildScrollView(
padding: const EdgeInsets.all(24.0),
child: SingleChildScrollView(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
const SizedBox(height: 20),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
// Session Date and Time
_buildSessionHeader(context, l10n),
// Session Date and Time
_buildSessionHeader(context, l10n),
const SizedBox(height: 18),
const SizedBox(height: 32),
// Focused Time Section
Text(l10n.youFocusedFor, style: AppTextStyles.headline),
const SizedBox(height: 8),
Text(
l10n.minutesValue(
session.actualMinutes,
l10n.minutes(session.actualMinutes),
),
style: AppTextStyles.largeNumber,
// Focused Time Section
Text(l10n.youFocusedFor, style: AppTextStyles.headline),
const SizedBox(height: 8),
Text(
l10n.minutesValue(
session.actualMinutes,
l10n.minutes(session.actualMinutes),
),
style: AppTextStyles.largeNumber,
),
const SizedBox(height: 32),
const SizedBox(height: 24),
// Points Earned Section
_buildPointsCard(
context,
l10n,
pointsEarned,
basePoints,
honestyBonus,
// Points Earned Section
_buildPointsCard(
context,
l10n,
pointsEarned,
basePoints,
honestyBonus,
),
const SizedBox(height: 16),
// Session Stats Card
Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: AppColors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
//Text(l10n.history, style: AppTextStyles.headline),
const SizedBox(height: 16),
const SizedBox(height: 16),
// Session Stats Card
Container(
width: double.infinity,
padding: const EdgeInsets.all(24),
decoration: BoxDecoration(
color: AppColors.white,
borderRadius: BorderRadius.circular(16),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('会话统计', style: AppTextStyles.headline),
const SizedBox(height: 16),
_buildStatRow(
icon: '⏱️',
label: '计划时长',
value: l10n.minutesValue(
session.durationMinutes,
l10n.minutes(session.durationMinutes),
),
_buildStatRow(
icon: '⏱️',
label: l10n.defaultFocusDuration,
value: l10n.minutesValue(
session.durationMinutes,
l10n.minutes(session.durationMinutes),
),
const SizedBox(height: 12),
),
const SizedBox(height: 12),
_buildStatRow(
icon: '',
label: '实际专注',
value: l10n.minutesValue(
session.actualMinutes,
l10n.minutes(session.actualMinutes),
),
_buildStatRow(
icon: '',
label: l10n.youFocusedFor,
value: l10n.minutesValue(
session.actualMinutes,
l10n.minutes(session.actualMinutes),
),
const SizedBox(height: 12),
),
const SizedBox(height: 12),
_buildStatRow(
icon: '🤚',
label: '分心次数',
value: l10n.distractionsCount(
session.distractionCount,
l10n.times(session.distractionCount),
),
),
const SizedBox(height: 12),
_buildStatRow(
icon: '🤚',
label: 'Distractions',
value:
'${session.distractionCount} ${l10n.times(session.distractionCount)}',
),
const SizedBox(height: 12),
_buildStatRow(
icon: '🏁',
label: '状态',
value: session.completed
? l10n.completed
: l10n.stoppedEarly,
),
const SizedBox(height: 20),
_buildStatRow(
icon: '🏁',
label: 'Status',
value: session.completed
? l10n.completed
: l10n.stoppedEarly,
),
const SizedBox(height: 20),
Text(
'"$encouragement"',
style: AppTextStyles.encouragementQuote,
),
],
),
Text(
'"$encouragement"',
style: AppTextStyles.encouragementQuote,
),
],
),
),
const SizedBox(height: 16),
const SizedBox(height: 16),
// Achievements Unlocked Section
if (sessionAchievements.isNotEmpty)
..._buildAchievementCards(context, l10n, sessionAchievements),
// Achievements Unlocked Section
if (sessionAchievements.isNotEmpty)
..._buildAchievementCards(context, l10n, sessionAchievements),
const SizedBox(height: 24),
const SizedBox(height: 24),
// Total Points Display
Text(
l10n.totalPoints(progress.totalPoints),
style: const TextStyle(
fontFamily: 'Nunito',
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.primary,
),
// Total Points Display
Text(
l10n.totalPoints(progress.totalPoints),
style: const TextStyle(
fontFamily: 'Nunito',
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.primary,
),
),
const SizedBox(height: 40),
],
),
const SizedBox(height: 40),
],
),
),
),
@@ -182,16 +176,36 @@ class SessionDetailScreen extends StatelessWidget {
return Container(
width: double.infinity,
padding: const EdgeInsets.all(20),
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: AppColors.white,
borderRadius: BorderRadius.circular(16),
borderRadius: BorderRadius.circular(12),
),
child: Column(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
Text(dateStr, style: AppTextStyles.headline),
const SizedBox(height: 8),
Text(timeStr, style: AppTextStyles.largeNumber),
Text(
dateStr,
style: const TextStyle(
fontFamily: 'Nunito',
fontSize: 16,
fontWeight: FontWeight.w600,
color: AppColors.textSecondary,
),
),
const SizedBox(width: 12),
const Text('', style: TextStyle(color: AppColors.textSecondary)),
const SizedBox(width: 12),
Text(
timeStr,
style: const TextStyle(
fontFamily: 'Nunito',
fontSize: 18,
fontWeight: FontWeight.w700,
color: AppColors.textPrimary,
),
),
],
),
);
@@ -341,8 +355,15 @@ class SessionDetailScreen extends StatelessWidget {
children: [
Text(icon, style: const TextStyle(fontSize: 20)),
const SizedBox(width: 12),
Text(label, style: AppTextStyles.bodyText),
const Spacer(),
Expanded(
child: Text(
label,
style: AppTextStyles.bodyText,
overflow: TextOverflow.ellipsis,
maxLines: 1,
),
),
const SizedBox(width: 8),
Text(
value,
style: const TextStyle(
@@ -428,7 +449,7 @@ class SessionDetailScreen extends StatelessWidget {
List<AchievementConfig> achievements,
) {
return [
Text('解锁的成就', style: AppTextStyles.headline),
Text(l10n.achievements, style: AppTextStyles.headline),
const SizedBox(height: 16),
...achievements.map((achievement) {
return Container(
@@ -457,7 +478,7 @@ class SessionDetailScreen extends StatelessWidget {
Text(achievement.icon, style: const TextStyle(fontSize: 32)),
const SizedBox(width: 12),
Text(
'成就解锁!',
l10n.achievementUnlocked,
style: const TextStyle(
fontFamily: 'Nunito',
fontSize: 18,