import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; import '../providers/app_provider.dart'; import '../models/data_models.dart'; /// 笔记列表项组件 class NoteListItem extends StatelessWidget { final Note note; const NoteListItem({super.key, required this.note}); @override Widget build(BuildContext context) { return Card( margin: const EdgeInsets.only(bottom: 12), child: InkWell( onTap: () { // 跳转到详情页 Navigator.pushNamed(context, '/note-detail', arguments: note); }, borderRadius: BorderRadius.circular(12), child: Padding( padding: const EdgeInsets.all(16), child: Column( crossAxisAlignment: CrossAxisAlignment.start, children: [ // 标题 Text( note.title, style: Theme.of(context).textTheme.titleMedium?.copyWith( fontWeight: FontWeight.bold, ), ), const SizedBox(height: 8), // 内容摘要 Text( note.content, style: Theme.of(context).textTheme.bodyMedium?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), maxLines: 3, overflow: TextOverflow.ellipsis, ), const SizedBox(height: 12), // 标签 if (note.tags.isNotEmpty) ...[ Wrap( spacing: 6, runSpacing: 6, children: note.tags.map((tag) => _buildTag(context, tag)).toList(), ), ], const SizedBox(height: 12), // 时间信息和操作按钮 Row( mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Text( _formatDate(note.updatedAt), style: Theme.of(context).textTheme.bodySmall?.copyWith( color: Theme.of(context).colorScheme.onSurfaceVariant, ), ), Row( mainAxisSize: MainAxisSize.min, children: [ IconButton( icon: const Icon(Icons.edit, size: 20), onPressed: () { Navigator.pushNamed(context, '/note-form', arguments: note); }, padding: EdgeInsets.zero, constraints: const BoxConstraints(), ), IconButton( icon: const Icon(Icons.delete_outline, size: 20), color: Colors.red, onPressed: () => _showDeleteDialog(context, note), padding: EdgeInsets.zero, constraints: const BoxConstraints(), ), ], ), ], ), ], ), ), ), ); } /// 构建标签 Widget _buildTag(BuildContext context, String tag) { return Container( padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 4), decoration: BoxDecoration( color: Theme.of(context).colorScheme.primaryContainer, borderRadius: BorderRadius.circular(12), ), child: Text( '#$tag', style: TextStyle( fontSize: 12, color: Theme.of(context).colorScheme.onPrimaryContainer, ), ), ); } /// 格式化日期 String _formatDate(DateTime date) { final now = DateTime.now(); final difference = now.difference(date); if (difference.inDays == 0) { if (difference.inHours == 0) { if (difference.inMinutes == 0) { return '刚刚'; } return '${difference.inMinutes}分钟前'; } return '${difference.inHours}小时前'; } else if (difference.inDays < 7) { return '${difference.inDays}天前'; } else { return '${date.year}-${date.month.toString().padLeft(2, '0')}-${date.day.toString().padLeft(2, '0')}'; } } /// 显示删除对话框 void _showDeleteDialog(BuildContext context, Note note) { showDialog( context: context, builder: (context) => AlertDialog( title: const Text('确认删除'), content: Text('确定要删除"${note.title}"吗?此操作不可恢复。'), actions: [ TextButton( onPressed: () => Navigator.pop(context), child: const Text('取消'), ), TextButton( onPressed: () async { await context.read().removeNote(note.id); if (!context.mounted) return; Navigator.pop(context); ScaffoldMessenger.of(context).showSnackBar( const SnackBar( content: Text('已删除'), behavior: SnackBarBehavior.floating, ), ); }, child: const Text( '删除', style: TextStyle(color: Colors.red), ), ), ], ), ); } }