message_list_page.dart 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. import 'package:flutter/material.dart';
  2. import 'package:liftmanager/internal/heavy/provider/heavy_page.dart';
  3. import 'package:liftmanager/internal/message/model/message_list_entity.dart';
  4. import 'package:liftmanager/internal/message/widgets/messageList.dart';
  5. import 'package:liftmanager/net/api_service.dart';
  6. import 'package:liftmanager/res/resources.dart';
  7. import 'package:liftmanager/routers/fluro_navigator.dart';
  8. import 'package:liftmanager/utils/fast_notification.dart';
  9. import 'package:liftmanager/utils/theme_utils.dart';
  10. import 'package:liftmanager/utils/toast.dart';
  11. import 'package:liftmanager/widgets/app_bar.dart';
  12. import 'package:liftmanager/widgets/load_image.dart';
  13. import 'package:liftmanager/widgets/popup_window.dart';
  14. import 'package:oktoast/oktoast.dart';
  15. import 'package:provider/provider.dart' as p;
  16. class MessageListPage extends StatefulWidget {
  17. @override
  18. MessageListPageState createState() => MessageListPageState();
  19. }
  20. class MessageListPageState extends State<MessageListPage>
  21. with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {
  22. HeavyPageProvider provider = HeavyPageProvider();
  23. List<Map> tabs = [
  24. {"id": 1, "name": "团队消息"},
  25. {"id": 2, "name": "保养消息"},
  26. {"id": 3, "name": "急修消息"},
  27. {"id": 4, "name": "工作消息"}
  28. ];
  29. TabController _tabController;
  30. PageController _pageController = PageController(initialPage: 0);
  31. GlobalKey _addKey = GlobalKey();
  32. GlobalKey _msgListKey = GlobalKey();
  33. List msgIdList = [];
  34. @override
  35. void initState() {
  36. super.initState();
  37. _tabController = new TabController(vsync: this, length: tabs.length);
  38. // FastNotification.addListener("msgListChage", (mgsList) {
  39. // if (mounted) {
  40. // msgIdList = [];
  41. // for (MessageListItem item in mgsList) {
  42. // msgIdList.add(item.id);
  43. // }
  44. // }
  45. // // setState(() {});
  46. // });
  47. }
  48. @override
  49. void dispose() {
  50. _tabController.dispose();
  51. super.dispose();
  52. }
  53. _onPageChange(int index) {
  54. _tabController.animateTo(index);
  55. provider.setIndex(index);
  56. }
  57. _showAddMenu() {
  58. final RenderBox button = _addKey.currentContext.findRenderObject();
  59. final RenderBox overlay = Overlay.of(context).context.findRenderObject();
  60. var a = button.localToGlobal(
  61. Offset(button.size.width - 8.0, button.size.height - 12.0),
  62. ancestor: overlay);
  63. var b = button.localToGlobal(button.size.bottomLeft(Offset(0, -12.0)),
  64. ancestor: overlay);
  65. final RelativeRect position = RelativeRect.fromRect(
  66. Rect.fromPoints(a, b),
  67. Offset.zero & overlay.size,
  68. );
  69. final Color backgroundColor = ThemeUtils.getBackgroundColor(context);
  70. final Color _iconColor = ThemeUtils.getIconColor(context);
  71. showPopupWindow(
  72. context: context,
  73. fullWidth: false,
  74. isShowBg: true,
  75. position: position,
  76. elevation: 0.0,
  77. child: GestureDetector(
  78. onTap: () => NavigatorUtils.goBack(context),
  79. child: Column(
  80. crossAxisAlignment: CrossAxisAlignment.end,
  81. children: <Widget>[
  82. Padding(
  83. padding: const EdgeInsets.only(right: 12.0),
  84. child: LoadAssetImage(
  85. "icon_jt",
  86. width: 8.0,
  87. height: 4.0,
  88. ),
  89. ),
  90. SizedBox(
  91. width: 120.0,
  92. height: 40.0,
  93. child: FlatButton.icon(
  94. textColor: Theme.of(context).textTheme.body1.color,
  95. onPressed: () {
  96. changeNoticeState(msgIdList);
  97. Navigator.pop(context);
  98. // NavigatorUtils.pushResult(
  99. // context, '${TeamRouter.teamCreatePage}', (res) {
  100. // _onRefresh();
  101. // });
  102. },
  103. color: backgroundColor,
  104. shape: RoundedRectangleBorder(
  105. borderRadius: BorderRadius.only(
  106. topLeft: Radius.circular(8.0),
  107. topRight: Radius.circular(8.0)),
  108. ),
  109. icon: Icon(
  110. const IconData(0xe62f, fontFamily: "Iconfont"),
  111. size: 16.0,
  112. color: _iconColor,
  113. ),
  114. // icon: LoadAssetImage(
  115. // "wode/icon_team_add",
  116. // width: 16.0,
  117. // height: 16.0,
  118. // color: _iconColor,
  119. // ),
  120. label: const Text("一键已读")),
  121. ),
  122. Container(width: 120.0, height: 0.6, color: Colours.line),
  123. SizedBox(
  124. width: 120.0,
  125. height: 40.0,
  126. child: FlatButton.icon(
  127. textColor: Theme.of(context).textTheme.body1.color,
  128. color: backgroundColor,
  129. onPressed: () {
  130. clearData(provider.index + 1);
  131. Navigator.pop(context);
  132. // NavigatorUtils.push(
  133. // context, '${TeamRouter.teamSearchPage}');
  134. },
  135. shape: RoundedRectangleBorder(
  136. borderRadius: BorderRadius.only(
  137. bottomLeft: Radius.circular(8.0),
  138. bottomRight: Radius.circular(8.0)),
  139. ),
  140. icon: Icon(
  141. const IconData(0xe715, fontFamily: "Iconfont"),
  142. size: 16.0,
  143. color: _iconColor,
  144. ),
  145. // LoadAssetImage(
  146. // "wode/icon_team_add",
  147. // width: 16.0,
  148. // height: 16.0,
  149. // color: _iconColor,
  150. // ),
  151. label: const Text("一键清空")),
  152. ),
  153. ],
  154. ),
  155. ),
  156. );
  157. }
  158. Future changeNoticeState(idList) async {
  159. print(idList);
  160. // showLoading(context, "正在提交...");
  161. await NewApiService().markMessagesRead(idList, onSuccess: (res) {
  162. // dismissLoading(context);
  163. // String initThisNotice = randomInt(1111, 9999).toString() +
  164. // DateTime.now().millisecondsSinceEpoch.toString();
  165. // FastNotification.push("initNotice", initThisNotice);
  166. // _onRefresh();
  167. showToast('标记已读成功');
  168. FastNotification.push('msgList');
  169. // setState(() {});
  170. }, onError: (code, msg) {
  171. toasts(msg);
  172. });
  173. }
  174. Future clearData(type, {List ids}) async {
  175. await NewApiService().deleteAllMessage(type, ids: ids, onSuccess: (res) {
  176. // String initThisNotice = randomInt(1111, 9999).toString() +
  177. // DateTime.now().millisecondsSinceEpoch.toString();
  178. // FastNotification.push("initNotice", initThisNotice);
  179. // _onRefresh();
  180. FastNotification.push('msgList');
  181. // FastNotification.push('msgListChage');
  182. // setState(() {});
  183. }, onError: (code, msg) {
  184. toasts(msg);
  185. });
  186. }
  187. @override
  188. Widget build(BuildContext context) {
  189. return p.ChangeNotifierProvider<HeavyPageProvider>(
  190. create: (_) => provider,
  191. child: WillPopScope(
  192. onWillPop: () {
  193. NavigatorUtils.goBackWithParams(context, true);
  194. return Future.value(false);
  195. },
  196. child: Scaffold(
  197. appBar: MyAppBar(
  198. centerTitle: "消息中心",
  199. actions: [
  200. // PopupMenuButton<String>(
  201. // itemBuilder: (BuildContext context) =>
  202. // <PopupMenuItem<String>>[
  203. // PopupMenuItem<String>(
  204. // value: '一键已读',
  205. // child: Row(children: <Widget>[
  206. // Padding(
  207. // padding:
  208. // EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0),
  209. // child: Icon(IconData( 0xe62f,
  210. // fontFamily: "Iconfont"))
  211. // ),
  212. // Text('一键已读')
  213. // ])),
  214. // PopupMenuItem<String>(
  215. // value: '一键清空',
  216. // child: Row(children: <Widget>[
  217. // Padding(
  218. // padding:
  219. // EdgeInsets.fromLTRB(0.0, 0.0, 8.0, 0.0),
  220. // child: Icon(IconData( 0xe715,
  221. // fontFamily: "Iconfont"))),
  222. // Text('一键清空')
  223. // ])),
  224. // ],
  225. // onSelected: (String value) {
  226. // // setState(() { _bodyStr = value; });
  227. // })
  228. InkWell(
  229. key: _addKey,
  230. onTap: () {
  231. _showAddMenu();
  232. // JhPopMenus.showLinePop(context,
  233. // clickCallback: (selectIndex, selectText) {});
  234. // print('object');
  235. },
  236. child: Icon(Icons.more_horiz),
  237. ),
  238. SizedBox(
  239. width: 5,
  240. )
  241. ],
  242. ),
  243. body: Column(
  244. crossAxisAlignment: CrossAxisAlignment.start,
  245. children: <Widget>[
  246. Container(
  247. // 隐藏点击效果
  248. color: ThemeUtils.getTabsBg(context),
  249. child: TabBar(
  250. onTap: (index) {
  251. if (!mounted) {
  252. return;
  253. }
  254. _pageController.jumpToPage(index);
  255. },
  256. isScrollable: false,
  257. controller: _tabController,
  258. labelStyle: TextStyles.textBold18,
  259. indicatorSize: TabBarIndicatorSize.label,
  260. labelPadding: const EdgeInsets.all(0),
  261. unselectedLabelColor: Colours.text_gray,
  262. labelColor: Theme.of(context).primaryColor,
  263. indicatorPadding:
  264. const EdgeInsets.only(left: 5.0, right: 5.0),
  265. tabs: tabs.map((map) {
  266. return _TabView("${map["name"]}", "", map["id"]);
  267. }).toList()),
  268. ),
  269. Gaps.line,
  270. Expanded(
  271. child: PageView.builder(
  272. key: const Key('pageView'),
  273. itemCount: tabs.length,
  274. onPageChanged: _onPageChange,
  275. controller: _pageController,
  276. itemBuilder: (BuildContext context, int index) {
  277. return Container(
  278. color: Color(0xffF6F6F6),
  279. // Color(0xffF6F6F6),
  280. // ThemeUtils.getBackgroundColor(context),
  281. child: MessageList(
  282. index: index + 1,
  283. returnMsgList: (msgList) {
  284. msgIdList = [];
  285. for (MessageListItem item in msgList) {
  286. msgIdList.add(item.id);
  287. }
  288. },
  289. ));
  290. },
  291. ),
  292. )
  293. ],
  294. ),
  295. ),
  296. ));
  297. }
  298. @override
  299. bool get wantKeepAlive => true;
  300. }
  301. class _TabView extends StatelessWidget {
  302. const _TabView(this.tabName, this.tabSub, this.index);
  303. final String tabName;
  304. final String tabSub;
  305. final int index;
  306. @override
  307. Widget build(BuildContext context) {
  308. return p.Consumer<HeavyPageProvider>(
  309. builder: (_, provider, child) {
  310. return Tab(
  311. child: SizedBox(
  312. child: Row(
  313. crossAxisAlignment: CrossAxisAlignment.center,
  314. mainAxisAlignment: MainAxisAlignment.center,
  315. children: <Widget>[
  316. Text(
  317. tabName,
  318. style: TextStyle(fontSize: 15),
  319. ),
  320. Offstage(
  321. offstage: provider.index != index,
  322. child: Padding(
  323. padding: const EdgeInsets.only(top: 1.0),
  324. child: Text(tabSub,
  325. style: TextStyle(fontSize: Dimens.font_sp12)),
  326. )),
  327. ],
  328. ),
  329. ));
  330. },
  331. );
  332. }
  333. }