list_card.dart 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import 'package:flutter/material.dart';
  2. import '../../core/theme/app_colors_extension.dart';
  3. /// Pencil Component/ListCard — 列表卡片(报销申请列表等)
  4. class ListCard extends StatelessWidget {
  5. final String cardNo;
  6. final String? applicant;
  7. final String? description;
  8. final String amount;
  9. final Color? amountColor;
  10. final String date;
  11. final Widget? statusTag;
  12. final VoidCallback? onTap;
  13. const ListCard({
  14. super.key,
  15. required this.cardNo,
  16. this.applicant,
  17. this.description,
  18. required this.amount,
  19. this.amountColor,
  20. required this.date,
  21. this.statusTag,
  22. this.onTap,
  23. });
  24. @override
  25. Widget build(BuildContext context) {
  26. final colors = Theme.of(context).extension<AppColorsExtension>()!;
  27. final desc = description ?? '';
  28. final sub = applicant ?? '';
  29. return GestureDetector(
  30. onTap: onTap,
  31. child: Container(
  32. padding: const EdgeInsets.all(12),
  33. decoration: BoxDecoration(color: colors.bgCard, borderRadius: BorderRadius.circular(8)),
  34. child: Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
  35. Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
  36. Flexible(child: Text(cardNo, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 14, fontWeight: FontWeight.w600, color: colors.textPrimary))),
  37. const SizedBox(width: 12),
  38. Text(amount, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 16, fontWeight: FontWeight.w700, color: amountColor ?? colors.amountPrimary)),
  39. ]),
  40. if (sub.isNotEmpty) ...[
  41. const SizedBox(height: 4),
  42. Text(sub, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 13, color: colors.textSecondary)),
  43. ],
  44. if (desc.isNotEmpty) ...[
  45. const SizedBox(height: 4),
  46. Text(desc, maxLines: 2, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 14, color: colors.textSecondary)),
  47. ],
  48. const SizedBox(height: 8),
  49. Row(mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [
  50. Flexible(child: Text(date, maxLines: 1, overflow: TextOverflow.ellipsis, style: TextStyle(fontSize: 12, color: colors.textPlaceholder))),
  51. const SizedBox(width: 8),
  52. ?statusTag,
  53. ]),
  54. ]),
  55. ),
  56. );
  57. }
  58. }