team_list_page.dart 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. import 'package:flutter/material.dart';
  2. import 'package:liftmanager/internal/team/presenter/team_list_presenter.dart';
  3. import 'package:liftmanager/internal/team/team_router.dart';
  4. import 'package:liftmanager/mvp/base_page_state.dart';
  5. import 'package:liftmanager/routers/fluro_navigator.dart';
  6. import 'package:liftmanager/internal/search/presenter/base_list_provider.dart';
  7. import 'package:liftmanager/internal/team/model/team_entity.dart';
  8. import 'package:liftmanager/res/resources.dart';
  9. import 'package:liftmanager/utils/image_utils.dart';
  10. import 'package:liftmanager/utils/theme_utils.dart';
  11. import 'package:liftmanager/utils/toast.dart';
  12. import 'package:liftmanager/widgets/app_bar.dart';
  13. import 'package:liftmanager/widgets/load_image.dart';
  14. import 'package:liftmanager/widgets/my_button.dart';
  15. import 'package:liftmanager/widgets/my_refresh_list.dart';
  16. import 'package:liftmanager/widgets/popup_window.dart';
  17. import 'package:liftmanager/widgets/state_layout.dart';
  18. import 'package:provider/provider.dart' as p;
  19. class TeamListPage extends StatefulWidget {
  20. @override
  21. TeamListPageState createState() {
  22. return TeamListPageState();
  23. }
  24. }
  25. class TeamListPageState extends BasePageState<TeamListPage, TeamListPresenter> {
  26. BaseListProvider<TeamItem> provider = BaseListProvider<TeamItem>();
  27. GlobalKey _addKey = GlobalKey();
  28. Future _onRefresh() async {
  29. await presenter.myTeamList(context);
  30. }
  31. @override
  32. void initState() {
  33. provider.setStateTypeNotNotify(StateType.loading);
  34. super.initState();
  35. _onRefresh();
  36. }
  37. ///切换团队
  38. _changeTeam(int index) {
  39. showAlert(
  40. context,
  41. "切换团队",
  42. "是否切换到:${provider.list[index].name}",
  43. "切换",
  44. () {
  45. NavigatorUtils.goBack(context);
  46. presenter.changeTeam(context, provider.list[index].id);
  47. },
  48. txt2: "取消",
  49. onPre2: () {
  50. NavigatorUtils.goBack(context);
  51. });
  52. }
  53. @override
  54. Widget build(BuildContext context) {
  55. return p.ChangeNotifierProvider<BaseListProvider<TeamItem>>(
  56. create: (_) => provider,
  57. child: WillPopScope(
  58. onWillPop: () {
  59. NavigatorUtils.goBackWithParams(context, true);
  60. return Future.value(false);
  61. },
  62. child: Scaffold(
  63. appBar: MyAppBar(
  64. centerTitle: "团队管理",
  65. actions: <Widget>[
  66. IconButton(
  67. key: _addKey,
  68. onPressed: () {
  69. _showAddMenu();
  70. },
  71. icon: LoadAssetImage(
  72. "icon_add",
  73. key: const Key('add'),
  74. width: 20.0,
  75. height: 20.0,
  76. color: Colors.black,
  77. ),
  78. )
  79. ],
  80. ),
  81. body: p.Consumer<BaseListProvider<TeamItem>>(
  82. builder: (_, provider, __) {
  83. bool isDark = ThemeUtils.isDark(context);
  84. return MyListView(
  85. key: Key('order_search_list'),
  86. itemCount: provider.list.length,
  87. stateType: provider.stateType,
  88. onRefresh: _onRefresh,
  89. // loadMore: _load,
  90. // itemExtent: 67.0,
  91. hasMore: provider.hasMore,
  92. itemBuilder: (_, index) {
  93. return Container(
  94. color: isDark ? Colours.dark_bg_color : Colors.white,
  95. padding: const EdgeInsets.symmetric(
  96. horizontal: 15.0, vertical: 12.0),
  97. alignment: Alignment.centerLeft,
  98. child: Row(
  99. children: <Widget>[
  100. CircleAvatar(
  101. radius: 21.5,
  102. backgroundColor: Colors.transparent,
  103. backgroundImage: ImageUtils.getImageProvider(
  104. provider.list[index]?.logoImg)),
  105. Gaps.hGap10,
  106. Expanded(
  107. flex: 1,
  108. child: Column(
  109. mainAxisAlignment: MainAxisAlignment.center,
  110. crossAxisAlignment: CrossAxisAlignment.start,
  111. children: <Widget>[
  112. Text(
  113. provider.list[index].name,
  114. style: TextStyle(
  115. fontSize: 15,
  116. color: isDark
  117. ? Colours.dark_text
  118. : Colours.text),
  119. ),
  120. Text(
  121. "${provider.list[index]?.remarks}",
  122. style: TextStyles.textGray13,
  123. maxLines: 2,
  124. overflow: TextOverflow.ellipsis,
  125. )
  126. ],
  127. )),
  128. MyButton(
  129. key: const Key('login'),
  130. onPressed: () {
  131. if (provider.list[index].currentTeamFlag)
  132. return;
  133. _changeTeam(index);
  134. },
  135. height: 25,
  136. fontSize: 11,
  137. backColor:provider.list[index].currentTeamFlag
  138. ? Colours.blue_app_main
  139. : Colors.white,
  140. colors: provider.list[index].currentTeamFlag
  141. ? [Colours.blue_app_main, Colours.blue_app_main]
  142. : [Colors.white, Colors.white],
  143. borderWidth: 0.5,
  144. borderColor: Colours.blue_app_main,
  145. text: provider.list[index].currentTeamFlag
  146. ? "当前团队"
  147. : "切换团队",
  148. textColor: provider.list[index].currentTeamFlag
  149. ? Colors.white
  150. : Colours.blue_app_main,
  151. )
  152. ],
  153. ),
  154. );
  155. },
  156. );
  157. }))));
  158. }
  159. _showAddMenu() {
  160. final RenderBox button = _addKey.currentContext.findRenderObject();
  161. final RenderBox overlay = Overlay.of(context).context.findRenderObject();
  162. var a = button.localToGlobal(
  163. Offset(button.size.width - 8.0, button.size.height - 12.0),
  164. ancestor: overlay);
  165. var b = button.localToGlobal(button.size.bottomLeft(Offset(0, -12.0)),
  166. ancestor: overlay);
  167. final RelativeRect position = RelativeRect.fromRect(
  168. Rect.fromPoints(a, b),
  169. Offset.zero & overlay.size,
  170. );
  171. final Color backgroundColor = ThemeUtils.getBackgroundColor(context);
  172. final Color _iconColor = ThemeUtils.getIconColor(context);
  173. showPopupWindow(
  174. context: context,
  175. fullWidth: false,
  176. isShowBg: true,
  177. position: position,
  178. elevation: 0.0,
  179. child: GestureDetector(
  180. onTap: () => NavigatorUtils.goBack(context),
  181. child: Column(
  182. crossAxisAlignment: CrossAxisAlignment.end,
  183. children: <Widget>[
  184. Padding(
  185. padding: const EdgeInsets.only(right: 12.0),
  186. child: LoadAssetImage(
  187. "icon_jt",
  188. width: 8.0,
  189. height: 4.0,
  190. ),
  191. ),
  192. SizedBox(
  193. width: 120.0,
  194. height: 40.0,
  195. child: FlatButton.icon(
  196. textColor: Theme.of(context).textTheme.body1.color,
  197. onPressed: () {
  198. Navigator.pop(context);
  199. NavigatorUtils.pushResult(
  200. context, '${TeamRouter.teamCreatePage}', (res) {
  201. _onRefresh();
  202. });
  203. },
  204. color: backgroundColor,
  205. shape: RoundedRectangleBorder(
  206. borderRadius: BorderRadius.only(
  207. topLeft: Radius.circular(8.0),
  208. topRight: Radius.circular(8.0)),
  209. ),
  210. icon: LoadAssetImage(
  211. "wode/icon_team_add",
  212. width: 16.0,
  213. height: 16.0,
  214. color: _iconColor,
  215. ),
  216. label: const Text("创建团队")),
  217. ),
  218. Container(width: 120.0, height: 0.6, color: Colours.line),
  219. SizedBox(
  220. width: 120.0,
  221. height: 40.0,
  222. child: FlatButton.icon(
  223. textColor: Theme.of(context).textTheme.body1.color,
  224. color: backgroundColor,
  225. onPressed: () {
  226. Navigator.pop(context);
  227. NavigatorUtils.push(
  228. context, '${TeamRouter.teamSearchPage}');
  229. },
  230. shape: RoundedRectangleBorder(
  231. borderRadius: BorderRadius.only(
  232. bottomLeft: Radius.circular(8.0),
  233. bottomRight: Radius.circular(8.0)),
  234. ),
  235. icon: LoadAssetImage(
  236. "wode/icon_team_add",
  237. width: 16.0,
  238. height: 16.0,
  239. color: _iconColor,
  240. ),
  241. label: const Text("加入团队")),
  242. ),
  243. ],
  244. ),
  245. ),
  246. );
  247. }
  248. @override
  249. TeamListPresenter createPresenter() {
  250. return TeamListPresenter();
  251. }
  252. }