team_list_page.dart 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  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: 24.0,
  75. height: 24.0,
  76. color: Colors.white,
  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. colors: provider.list[index].currentTeamFlag
  138. ? [Colours.app_main, Colours.app_main]
  139. : [Colors.white, Colors.white],
  140. borderWidth: 0.5,
  141. borderColor: Colours.app_main,
  142. text: provider.list[index].currentTeamFlag
  143. ? "当前团队"
  144. : "切换团队",
  145. textColor: provider.list[index].currentTeamFlag
  146. ? Colors.white
  147. : Colours.app_main,
  148. )
  149. ],
  150. ),
  151. );
  152. },
  153. );
  154. }))));
  155. }
  156. _showAddMenu() {
  157. final RenderBox button = _addKey.currentContext.findRenderObject();
  158. final RenderBox overlay = Overlay.of(context).context.findRenderObject();
  159. var a = button.localToGlobal(
  160. Offset(button.size.width - 8.0, button.size.height - 12.0),
  161. ancestor: overlay);
  162. var b = button.localToGlobal(button.size.bottomLeft(Offset(0, -12.0)),
  163. ancestor: overlay);
  164. final RelativeRect position = RelativeRect.fromRect(
  165. Rect.fromPoints(a, b),
  166. Offset.zero & overlay.size,
  167. );
  168. final Color backgroundColor = ThemeUtils.getBackgroundColor(context);
  169. final Color _iconColor = ThemeUtils.getIconColor(context);
  170. showPopupWindow(
  171. context: context,
  172. fullWidth: false,
  173. isShowBg: true,
  174. position: position,
  175. elevation: 0.0,
  176. child: GestureDetector(
  177. onTap: () => NavigatorUtils.goBack(context),
  178. child: Column(
  179. crossAxisAlignment: CrossAxisAlignment.end,
  180. children: <Widget>[
  181. Padding(
  182. padding: const EdgeInsets.only(right: 12.0),
  183. child: LoadAssetImage(
  184. "icon_jt",
  185. width: 8.0,
  186. height: 4.0,
  187. ),
  188. ),
  189. SizedBox(
  190. width: 120.0,
  191. height: 40.0,
  192. child: FlatButton.icon(
  193. textColor: Theme.of(context).textTheme.body1.color,
  194. onPressed: () {
  195. Navigator.pop(context);
  196. NavigatorUtils.pushResult(
  197. context, '${TeamRouter.teamCreatePage}', (res) {
  198. _onRefresh();
  199. });
  200. },
  201. color: backgroundColor,
  202. shape: RoundedRectangleBorder(
  203. borderRadius: BorderRadius.only(
  204. topLeft: Radius.circular(8.0),
  205. topRight: Radius.circular(8.0)),
  206. ),
  207. icon: LoadAssetImage(
  208. "wode/icon_team_add",
  209. width: 16.0,
  210. height: 16.0,
  211. color: _iconColor,
  212. ),
  213. label: const Text("创建团队")),
  214. ),
  215. Container(width: 120.0, height: 0.6, color: Colours.line),
  216. SizedBox(
  217. width: 120.0,
  218. height: 40.0,
  219. child: FlatButton.icon(
  220. textColor: Theme.of(context).textTheme.body1.color,
  221. color: backgroundColor,
  222. onPressed: () {
  223. Navigator.pop(context);
  224. NavigatorUtils.push(
  225. context, '${TeamRouter.teamSearchPage}');
  226. },
  227. shape: RoundedRectangleBorder(
  228. borderRadius: BorderRadius.only(
  229. bottomLeft: Radius.circular(8.0),
  230. bottomRight: Radius.circular(8.0)),
  231. ),
  232. icon: LoadAssetImage(
  233. "wode/icon_team_add",
  234. width: 16.0,
  235. height: 16.0,
  236. color: _iconColor,
  237. ),
  238. label: const Text("加入团队")),
  239. ),
  240. ],
  241. ),
  242. ),
  243. );
  244. }
  245. @override
  246. TeamListPresenter createPresenter() {
  247. return TeamListPresenter();
  248. }
  249. }