Files
ai_english/client/lib/features/home/widgets/daily_goal_card.dart
2025-11-17 14:09:17 +08:00

261 lines
7.8 KiB
Dart

import 'package:flutter/material.dart';
import '../../../core/theme/app_colors.dart';
import '../../../core/theme/app_text_styles.dart';
import '../../../core/theme/app_dimensions.dart';
/// 每日目标卡片组件
class DailyGoalCard extends StatelessWidget {
const DailyGoalCard({super.key});
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(AppDimensions.spacingMd),
decoration: BoxDecoration(
color: AppColors.surface,
borderRadius: BorderRadius.circular(AppDimensions.radiusMd),
boxShadow: [
BoxShadow(
color: AppColors.shadow.withOpacity(0.1),
blurRadius: 8,
offset: const Offset(0, 2),
),
],
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.track_changes,
color: AppColors.primary,
size: 24,
),
const SizedBox(width: AppDimensions.spacingSm),
Text(
'今日目标进度',
style: AppTextStyles.titleMedium.copyWith(
color: AppColors.onSurface,
fontWeight: FontWeight.w600,
),
),
],
),
const SizedBox(height: AppDimensions.spacingMd),
// 单词学习目标
_buildGoalItem(
icon: Icons.book,
title: '单词学习',
current: 15,
target: 20,
unit: '',
color: AppColors.primary,
),
const SizedBox(height: AppDimensions.spacingMd),
// 学习时长目标
_buildGoalItem(
icon: Icons.timer,
title: '学习时长',
current: 25,
target: 30,
unit: '分钟',
color: AppColors.secondary,
),
const SizedBox(height: AppDimensions.spacingMd),
// 练习题目标
_buildGoalItem(
icon: Icons.quiz,
title: '练习题',
current: 8,
target: 10,
unit: '',
color: AppColors.tertiary,
),
const SizedBox(height: AppDimensions.spacingLg),
// 总体进度
_buildOverallProgress(),
],
),
);
}
/// 构建目标项
Widget _buildGoalItem({
required IconData icon,
required String title,
required int current,
required int target,
required String unit,
required Color color,
}) {
final progress = current / target;
final isCompleted = current >= target;
return Row(
children: [
Container(
width: 32,
height: 32,
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(8),
),
child: Icon(
icon,
color: color,
size: 18,
),
),
const SizedBox(width: AppDimensions.spacingMd),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
title,
style: AppTextStyles.bodyMedium.copyWith(
color: AppColors.onSurface,
fontWeight: FontWeight.w500,
),
),
Row(
children: [
Text(
'$current/$target $unit',
style: AppTextStyles.bodySmall.copyWith(
color: isCompleted ? AppColors.success : AppColors.onSurfaceVariant,
fontWeight: FontWeight.w500,
),
),
if (isCompleted) ...[
const SizedBox(width: AppDimensions.spacingXs),
Icon(
Icons.check_circle,
color: AppColors.success,
size: 16,
),
]
],
),
],
),
const SizedBox(height: AppDimensions.spacingXs),
// 进度条
Container(
height: 6,
decoration: BoxDecoration(
color: color.withOpacity(0.1),
borderRadius: BorderRadius.circular(3),
),
child: FractionallySizedBox(
alignment: Alignment.centerLeft,
widthFactor: progress.clamp(0.0, 1.0),
child: Container(
decoration: BoxDecoration(
color: isCompleted ? AppColors.success : color,
borderRadius: BorderRadius.circular(3),
),
),
),
),
],
),
),
],
);
}
/// 构建总体进度
Widget _buildOverallProgress() {
const totalProgress = 0.75; // 75% 完成
return Container(
padding: const EdgeInsets.all(AppDimensions.spacingMd),
decoration: BoxDecoration(
gradient: LinearGradient(
begin: Alignment.topLeft,
end: Alignment.bottomRight,
colors: [
AppColors.primary.withOpacity(0.1),
AppColors.secondary.withOpacity(0.1),
],
),
borderRadius: BorderRadius.circular(AppDimensions.radiusSm),
border: Border.all(
color: AppColors.primary.withOpacity(0.2),
width: 1,
),
),
child: Column(
children: [
Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [
Text(
'今日完成度',
style: AppTextStyles.titleSmall.copyWith(
color: AppColors.primary,
fontWeight: FontWeight.w600,
),
),
Text(
'${(totalProgress * 100).toInt()}%',
style: AppTextStyles.titleSmall.copyWith(
color: AppColors.primary,
fontWeight: FontWeight.w700,
),
),
],
),
const SizedBox(height: AppDimensions.spacingSm),
// 总体进度条
Container(
height: 8,
decoration: BoxDecoration(
color: AppColors.primary.withOpacity(0.1),
borderRadius: BorderRadius.circular(4),
),
child: FractionallySizedBox(
alignment: Alignment.centerLeft,
widthFactor: totalProgress,
child: Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
AppColors.primary,
AppColors.secondary,
],
),
borderRadius: BorderRadius.circular(4),
),
),
),
),
const SizedBox(height: AppDimensions.spacingSm),
Text(
totalProgress >= 1.0
? '🎉 恭喜!今日目标已完成!'
: '继续加油,距离完成目标还有一点点!',
style: AppTextStyles.bodySmall.copyWith(
color: AppColors.onSurfaceVariant,
fontStyle: FontStyle.italic,
),
textAlign: TextAlign.center,
),
],
),
);
}
}