userList.dart 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. import 'package:flutter/foundation.dart';
  2. import 'package:flutter/material.dart';
  3. import 'package:flutter/cupertino.dart';
  4. import 'package:provider/provider.dart';
  5. import 'package:twongCustomer/store/models/serverModel.dart';
  6. import '../models/index.dart';
  7. import '../routes/utils.dart';
  8. import '../utils/events.dart';
  9. import '../utils/socket.dart';
  10. import '../pages/setting.dart';
  11. import '../utils/size_fit.dart';
  12. import '../utils/notification.dart';
  13. class UserListPage extends StatefulWidget {
  14. @override
  15. State<StatefulWidget> createState() {
  16. return _UserListPageState();
  17. }
  18. }
  19. class _UserListPageState extends State<UserListPage> {
  20. int unread = 99;
  21. bool disposed = false;
  22. List<UserInfo> userList = new List<UserInfo>();
  23. Map<String, int> unreadMap = new Map<String, int>();
  24. Map<String, String> msgMap = new Map<String, String>();
  25. @override
  26. void initState() {
  27. super.initState();
  28. disposed = false;
  29. initNetwork();
  30. initEventListener();
  31. }
  32. @override
  33. void dispose() {
  34. super.dispose();
  35. disposed = true;
  36. print("user list dispose");
  37. }
  38. void initNetwork() {
  39. // String server = Provider.of<ServerModel>(context,listen: false).wsServer;
  40. // print(server);
  41. Socket.connect();
  42. }
  43. void initEventListener() {
  44. Events.on<UserOnline>().listen((event) {
  45. if (!mounted) return;
  46. setState(() {
  47. userList.add(event.user);
  48. });
  49. });
  50. Events.on<UserList>().listen((event) {
  51. if (!mounted) return;
  52. setState(() {
  53. userList = event.users;
  54. });
  55. });
  56. Events.on<ClearUnread>().listen((event) {
  57. if (!mounted) return;
  58. setState(() {
  59. if (unreadMap.containsKey(event.uid)) {
  60. unreadMap[event.uid] = 0;
  61. }
  62. });
  63. });
  64. Events.on<NotifyMessage>().listen((event) {
  65. if (!mounted) return;
  66. var user = userList.singleWhere((element) => element.uid == event.payload, orElse: () => null);
  67. if (user != null) _itemClick(user);
  68. });
  69. Events.on<UserMessage>().listen((event) {
  70. print(event.message.toJson());
  71. Notifications.showNotify(event.message.visitor_name, event.message.content, payload: event.message.id);
  72. if (!mounted) return;
  73. setState(() {
  74. if(unreadMap[event.message.id] == null) {
  75. unreadMap[event.message.id] = 1;
  76. } else {
  77. unreadMap[event.message.id] ++;
  78. }
  79. msgMap[event.message.id] = event.message.content;
  80. });
  81. });
  82. }
  83. @override
  84. Widget build(BuildContext context) {
  85. return Scaffold(
  86. appBar: AppBar(
  87. title: Text("美天旺客服"),
  88. automaticallyImplyLeading: false,
  89. actions: [
  90. IconButton(icon: Icon(Icons.settings), onPressed: (){
  91. Navigator.push(context,
  92. new MaterialPageRoute(builder: (context) => new SettingPage()));
  93. })
  94. ],
  95. ),
  96. body: userList.length > 0 ? _buildList() : _buildNoData(),
  97. );
  98. }
  99. Widget _buildNoData() {
  100. return Center(
  101. child: Text("暂时没有消息"),
  102. );
  103. }
  104. Widget _buildUser(BuildContext context, int index) {
  105. var user = userList[index];
  106. var unreadWidget = Container();
  107. if (int.parse(getMsgCount(user.uid)) > 0) {
  108. unreadWidget = Container(
  109. width: 20,
  110. height: 20,
  111. alignment: Alignment.center,
  112. decoration: BoxDecoration(
  113. color: Colors.red,
  114. borderRadius: BorderRadius.all(Radius.circular(25.0)),
  115. ),
  116. child: Text(
  117. getMsgCount(user.uid), style: TextStyle(color: Colors.white),),
  118. );
  119. }
  120. return InkWell(
  121. onTap: () => _itemClick(user),
  122. child: Container(
  123. margin: EdgeInsets.all(10),
  124. child: Row(
  125. children: [
  126. ClipRRect(borderRadius: BorderRadius.circular(20),child: Image.network(user.avator,width: 40,height: 40)),
  127. Container(
  128. margin: EdgeInsets.all(10),
  129. child: Column(
  130. crossAxisAlignment: CrossAxisAlignment.start,
  131. children: [
  132. Row(
  133. children: [
  134. Container(
  135. height: 20,
  136. // width: 550.rpx,
  137. child: Text(user.username, style: TextStyle(fontSize: 16, fontWeight: FontWeight.bold)),
  138. ),
  139. // Text("9:12", style: TextStyle(fontSize: 14, color: Colors.grey)),
  140. ],
  141. ),
  142. Row(
  143. children: [
  144. Container(
  145. height: 20,
  146. width: 550.rpx,
  147. margin: EdgeInsets.only(top: 4),
  148. child: Text(getMsgContent(user.uid), style: TextStyle(fontSize: 14, color: Colors.grey)),
  149. ),
  150. unreadWidget
  151. ],
  152. )
  153. ],
  154. ),
  155. )
  156. ],
  157. ),
  158. ),
  159. );
  160. }
  161. Widget _buildList() {
  162. return SafeArea(child: ListView.builder(
  163. physics: new NeverScrollableScrollPhysics(),
  164. itemBuilder: _buildUser,
  165. itemCount: userList.length));
  166. }
  167. String getMsgCount(String uid) {
  168. var count = unreadMap[uid];
  169. if (count == null) return "0";
  170. else return count.toString();
  171. }
  172. String getMsgContent(String id) {
  173. if(msgMap[id] == null) return "暂无消息";
  174. return msgMap[id];
  175. }
  176. void _itemClick (UserInfo user) {
  177. RouterUtils.toChat(context, user);
  178. }
  179. }