import 'package:fluent_ui/fluent_ui.dart'; import 'package:task_hub/models/task.dart'; class TaskDialog extends StatefulWidget { final Task? task; final ValueChanged onSave; const TaskDialog({super.key, this.task, required this.onSave}); @override State createState() => _TaskDialogState(); } class _TaskDialogState extends State { late TextEditingController _titleController; late TextEditingController _descriptionController; late Priority _selectedPriority; DateTime? _selectedDate; final _formKey = GlobalKey(); @override void initState() { super.initState(); _titleController = TextEditingController(text: widget.task?.title ?? ''); _descriptionController = TextEditingController( text: widget.task?.description ?? '', ); _selectedPriority = widget.task?.priority ?? Priority.medium; _selectedDate = widget.task?.dueDate; } @override void dispose() { _titleController.dispose(); _descriptionController.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return ContentDialog( title: Text(widget.task == null ? '添加任务' : '编辑任务'), content: Form( key: _formKey, child: Column( mainAxisSize: MainAxisSize.min, children: [ // 标题 _buildFormRow( label: '任务标题', required: true, child: TextFormBox( controller: _titleController, placeholder: '请输入任务标题', validator: (value) { if (value == null || value.isEmpty) { return '任务标题不能为空'; } return null; }, ), ), const SizedBox(height: 16), // 描述 _buildFormRow( label: '任务描述', child: TextFormBox( controller: _descriptionController, placeholder: '请输入任务描述', maxLines: 3, ), ), const SizedBox(height: 16), // 优先级 _buildFormRow( label: '优先级', child: RadioGroup( groupValue: _selectedPriority, child: Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ RadioButton( value: Priority.low, content: Text('低'), ), RadioButton( value: Priority.medium, content: Text('中'), ), RadioButton( value: Priority.high, content: Text('高'), ) ], ), onChanged: (value) { if (value != null) { setState(() { _selectedPriority = value; }); } }, ), ), const SizedBox(height: 16), // 截止日期 _buildFormRow( label: '截止日期', child: DatePicker( selected: _selectedDate, onChanged: (date) { setState(() { _selectedDate = date; }); }, ), ), ], ), ), actions: [ Button( child: const Text('取消'), onPressed: () => Navigator.pop(context), ), FilledButton( child: const Text('保存'), onPressed: () { if (_formKey.currentState!.validate()) { final task = Task( id: widget.task?.id, title: _titleController.text, description: _descriptionController.text.isEmpty ? null : _descriptionController.text, dueDate: _selectedDate, priority: _selectedPriority, isCompleted: widget.task?.isCompleted ?? false, ); widget.onSave(task); Navigator.pop(context); } }, ), ], ); } // 构建表单行 Widget _buildFormRow({ required String label, required Widget child, bool required = false, }) { return Row( crossAxisAlignment: CrossAxisAlignment.start, children: [ SizedBox( width: 80, child: Padding( padding: const EdgeInsets.only(top: 8), child: Row( mainAxisSize: MainAxisSize.min, children: [ if (required) Padding( padding: EdgeInsets.only(right: 4), child: Text( '*', style: TextStyle(color: Colors.red, fontSize: 16), ), ), Text( label, style: const TextStyle( fontSize: 14, fontWeight: FontWeight.w500, ), ), const Text( ':', style: TextStyle(fontSize: 14), ), ], ), ), ), const SizedBox(width: 12), // 右侧表单控件 Expanded( child: child, ), ], ); } String _getPriorityLabel(Priority priority) { switch (priority) { case Priority.low: return '低'; case Priority.medium: return '中'; case Priority.high: return '高'; } } }