messages_page.dart 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. import 'package:flutter/material.dart';
  2. class MessagesPage extends StatefulWidget {
  3. @override
  4. State<MessagesPage> createState() => _MessagesPageState();
  5. }
  6. class _MessagesPageState extends State<MessagesPage>
  7. with SingleTickerProviderStateMixin {
  8. late TabController _tabController;
  9. final List<String> tabs = ['全部', '客服', '待付尾款', '待付回款', '订单完成', '订单撤销'];
  10. @override
  11. void initState() {
  12. _tabController = TabController(length: tabs.length, vsync: this);
  13. super.initState();
  14. }
  15. @override
  16. void dispose() {
  17. _tabController.dispose();
  18. super.dispose();
  19. }
  20. Widget _buildMessageItem({
  21. required String title,
  22. required String subtitle,
  23. required String leading,
  24. required String time,
  25. int? badgeCount,
  26. }) {
  27. return ListTile(
  28. leading: CircleAvatar(
  29. backgroundColor: Colors.grey.shade200,
  30. child: Text(leading, style: const TextStyle(color: Colors.black)),
  31. ),
  32. title: Text(title, style: const TextStyle(fontWeight: FontWeight.bold)),
  33. subtitle: Text(subtitle),
  34. trailing: Column(
  35. mainAxisAlignment: MainAxisAlignment.center,
  36. children: [
  37. Text(time, style: const TextStyle(color: Colors.grey)),
  38. if (badgeCount != null)
  39. Container(
  40. margin: const EdgeInsets.only(top: 4),
  41. padding: const EdgeInsets.symmetric(horizontal: 6, vertical: 2),
  42. decoration: BoxDecoration(
  43. color: badgeCount > 0 ? Colors.red : Colors.grey,
  44. borderRadius: BorderRadius.circular(12),
  45. ),
  46. child: Text(
  47. badgeCount > 99 ? '99+' : '$badgeCount',
  48. style: const TextStyle(color: Colors.white, fontSize: 12),
  49. ),
  50. ),
  51. ],
  52. ),
  53. );
  54. }
  55. @override
  56. Widget build(BuildContext context) {
  57. return Scaffold(
  58. appBar: AppBar(
  59. title: const Text('消息', style: TextStyle(fontWeight: FontWeight.bold)),
  60. centerTitle: true,
  61. actions: [
  62. IconButton(onPressed: () {}, icon: const Icon(Icons.search)),
  63. ],
  64. bottom: TabBar(
  65. controller: _tabController,
  66. isScrollable: true,
  67. labelColor: Colors.blue,
  68. unselectedLabelColor: Colors.black,
  69. indicatorColor: Colors.blue,
  70. tabs: tabs.map((tab) => Tab(text: tab)).toList(),
  71. ),
  72. ),
  73. body: TabBarView(
  74. controller: _tabController,
  75. children: tabs.map((_) {
  76. return ListView(
  77. children: [
  78. _buildMessageItem(
  79. leading: '系统',
  80. title: '[置顶]系统消息',
  81. subtitle: '您的订单已完成',
  82. time: '3月3日',
  83. ),
  84. _buildMessageItem(
  85. leading: '官方',
  86. title: '[置顶]商务客服',
  87. subtitle: '[客服] 欢迎来到名媛汇',
  88. time: '24/3/3',
  89. badgeCount: 6,
  90. ),
  91. _buildMessageItem(
  92. leading: '订单',
  93. title: '3/3 XXX-XXX-XXX',
  94. subtitle: '[待付尾款]',
  95. time: '02:02',
  96. badgeCount: 999,
  97. ),
  98. _buildMessageItem(
  99. leading: '订单',
  100. title: '3/3 XXX-XXX-XXX',
  101. subtitle: '[待付回款]',
  102. time: '周三',
  103. badgeCount: 99,
  104. ),
  105. _buildMessageItem(
  106. leading: '订单',
  107. title: '3/3 XXX-XXX-XXX',
  108. subtitle: '[订单完成]',
  109. time: '24/3/3',
  110. ),
  111. _buildMessageItem(
  112. leading: '订单',
  113. title: '3/3 XXX-XXX-XXX',
  114. subtitle: '[订单撤销]',
  115. time: '24/3/3',
  116. ),
  117. _buildMessageItem(
  118. leading: '订单',
  119. title: '3/3 XXX-XXX-XXX',
  120. subtitle: '[待付尾款]',
  121. time: '24/3/3',
  122. badgeCount: 10,
  123. ),
  124. _buildMessageItem(
  125. leading: '订单',
  126. title: '3/3 XXX-XXX-XXX',
  127. subtitle: '[待付回款]',
  128. time: '24/3/3',
  129. ),
  130. _buildMessageItem(
  131. leading: '订单',
  132. title: '3/3 XXX-XXX-XXX',
  133. subtitle: '[待付尾款]',
  134. time: '24/3/3',
  135. badgeCount: 9,
  136. ),
  137. ],
  138. );
  139. }).toList(),
  140. ),
  141. );
  142. }
  143. }