Files
task_hub/lib/widges/task_item.dart
2026-04-25 21:25:02 +08:00

151 lines
4.8 KiB
Dart

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<Priority> 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<Priority, (Color, String)> 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')}';
}
}