import 'package:fluent_ui/fluent_ui.dart'; import 'package:task_hub/models/task.dart'; class TaskItem extends StatelessWidget { final Task task; final VoidCallback onToggleComplete; final VoidCallback onEdit; final VoidCallback onDelete; final ValueChanged onPriorityChanged; const TaskItem({ super.key, required this.task, required this.onToggleComplete, required this.onEdit, required this.onDelete, required this.onPriorityChanged, }); @override Widget build(BuildContext context) { return Card( child: Padding( padding: const EdgeInsets.all(12.0), child: Row( children: [ // 完成状态复选框 Checkbox( checked: task.isCompleted, onChanged: (value) => onToggleComplete(), ), const SizedBox(width: 12), // 任务信息 Expanded( child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ Row( children: [ // 优先级指示器 _buildPriorityIndicator(task.priority), const SizedBox(width: 8), Expanded( child: Text( task.title, style: TextStyle( fontSize: 16, fontWeight: FontWeight.w500, decoration: task.isCompleted ? TextDecoration.lineThrough : null, color: task.isCompleted ? Colors.grey : Colors.red, ), ), ), ], ), const SizedBox(height: 2), if (task.description != null && task.description!.isNotEmpty) Padding( padding: const EdgeInsets.only(top: 4.0), child: Text( task.description!, style: TextStyle( color: Colors.grey, fontSize: 14, decoration: task.isCompleted ? TextDecoration.lineThrough : null, ), ), ), const SizedBox(height: 2), if (task.dueDate != null) Padding( padding: const EdgeInsets.only(top: 4.0), child: Row( children: [ const Icon( FluentIcons.calendar, size: 12, color: Colors.grey, ), const SizedBox(width: 4), Text( '截止: ${_formatDate(task.dueDate!)}', style: const TextStyle( color: Colors.grey, fontSize: 12, ), ), ], ), ), ], ), ), // 操作按钮 Row( children: [ // 编辑按钮 IconButton( icon: const Icon(FluentIcons.edit, size: 16), onPressed: onEdit, ), // 删除按钮 IconButton( icon: const Icon(FluentIcons.delete, size: 16), onPressed: onDelete, ), ], ), ], ), ), ); } Widget _buildPriorityIndicator(Priority priority) { final Map priorityInfo = { Priority.low: (Colors.grey, '低'), Priority.medium: (Colors.green, '中'), Priority.high: (Colors.red, '高'), }; final (color, label) = priorityInfo[priority]!; return Container( padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 3), decoration: BoxDecoration( color: color, borderRadius: BorderRadius.circular(4), ), child: Center( child: Text( label, style: const TextStyle( color: Colors.white, fontSize: 10, fontWeight: FontWeight.bold, ), ), ), ); } String _formatDate(DateTime date) { return '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; } }