maintenance_list_page.dart 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282
  1. import 'package:flutter/material.dart';
  2. import 'package:liftmanager/internal/maintenance/model/maintenance_count_item.dart';
  3. import 'package:liftmanager/internal/maintenance/provider/maintenance_page_provider.dart';
  4. import 'package:liftmanager/internal/maintenance/widgets/maintenance_list.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/theme_utils.dart';
  9. import 'package:liftmanager/widgets/app_bar.dart';
  10. import 'package:liftmanager/widgets/calendar/flutter_calendar.dart';
  11. import 'package:provider/provider.dart' as p;
  12. class MaintenanceListPage extends StatefulWidget {
  13. MaintenanceListPage({this.topInto = false});
  14. final bool topInto;
  15. @override
  16. MaintenanceListPageState createState() => MaintenanceListPageState();
  17. }
  18. class MaintenanceListPageState extends State<MaintenanceListPage>
  19. with SingleTickerProviderStateMixin, AutomaticKeepAliveClientMixin {
  20. MaintenancePageProvider provider = MaintenancePageProvider();
  21. List<Map> tabs = [
  22. {"id": 0, "name": "待保养"},
  23. {"id": 1, "name": "保养中"},
  24. {"id": 2, "name": "已完成"},
  25. {"id": 3, "name": "超期"}
  26. ];
  27. TabController _tabController;
  28. PageController _pageController;
  29. Calendar mCalendar;
  30. DateTime selectedDate = DateTime.now();
  31. DateTime _pageDate = DateTime.now();
  32. List<MantenanceCountItem> _arrCount = [];
  33. List<Widget> mListView = [];
  34. @override
  35. void initState() {
  36. super.initState();
  37. initListView();
  38. _tabController = new TabController(vsync: this, length: tabs.length);
  39. if(widget.topInto){
  40. _tabController.animateTo(1);
  41. _pageController = PageController(initialPage: 1);
  42. }else{
  43. _pageController = PageController(initialPage: 0);
  44. }
  45. getCalenderDate();
  46. }
  47. initListView() {
  48. mListView.add(MaintenanceList(index: 0, date: DateTime.now(),callback: (){
  49. getCalenderDate();
  50. },));
  51. mListView.add(MaintenanceList(index: 1, date: DateTime.now(),callback: (){
  52. getCalenderDate();
  53. }));
  54. mListView.add(MaintenanceList(index: 2, date: DateTime.now(),callback: (){
  55. getCalenderDate();
  56. }));
  57. mListView.add(MaintenanceList(index: 3, date: DateTime.now(),callback: (){
  58. getCalenderDate();
  59. }));
  60. }
  61. @override
  62. void dispose() {
  63. _tabController.dispose();
  64. super.dispose();
  65. }
  66. _onPageChange(int index) {
  67. _tabController.animateTo(index);
  68. provider.setIndex(index);
  69. MaintenanceList widget = mListView[_pageController.page.toInt()];
  70. if(widget.mState !=null){
  71. widget.mState.onRefresh();
  72. }
  73. }
  74. void getCalenderDate() {
  75. ApiService(context: context)
  76. .maintenanceCount(_pageDate.toString().split(" ")[0], onSuccess: (res) {
  77. _arrCount = res;
  78. initHeaderTitle();
  79. setState(() {});
  80. }, onError: (code, msg) {});
  81. }
  82. void initHeaderTitle() {
  83. mCalendar.updateState(_arrCount);
  84. }
  85. mCount(int key) {
  86. int str = 0;
  87. for (var i = 0; i < _arrCount.length; i++) {
  88. if (DateTime.parse('${_arrCount[i].planDate}').year == mCalendar.currentSelected().year&&
  89. DateTime.parse('${_arrCount[i].planDate}').month == mCalendar.currentSelected().month&&
  90. DateTime.parse('${_arrCount[i].planDate}').day == mCalendar.currentSelected().day) {
  91. switch(key){
  92. case 0:
  93. str = _arrCount[i].waitingMaintenance;
  94. break;
  95. case 1:
  96. str = _arrCount[i].inProgress;
  97. break;
  98. case 2:
  99. str = _arrCount[i].complete;
  100. break;
  101. case 3:
  102. str = _arrCount[i].overdue;
  103. break;
  104. }
  105. }
  106. }
  107. return "(${str})";
  108. }
  109. @override
  110. Widget build(BuildContext context) {
  111. super.build(context);
  112. return p.ChangeNotifierProvider<MaintenancePageProvider>(
  113. create: (_) => provider,
  114. child: WillPopScope(
  115. onWillPop:(){
  116. NavigatorUtils.goBackWithParams(context,true);
  117. return Future.value(false);
  118. },
  119. child:Scaffold(
  120. appBar: MyAppBar(
  121. centerTitle: "保养管理",
  122. // actions: <Widget>[
  123. // FlatButton(
  124. // child: Text("今天"),
  125. // textColor: Colours.dark_text,
  126. // highlightColor: Colors.transparent,
  127. // onPressed: () {
  128. // mCalendar.today();
  129. // },
  130. // )
  131. // ],
  132. ),
  133. body: Column(
  134. crossAxisAlignment: CrossAxisAlignment.start,
  135. children: <Widget>[
  136. calendarWidget(),
  137. Container(
  138. // 隐藏点击效果
  139. color: ThemeUtils.getTabsBg(context),
  140. child: TabBar(
  141. onTap: (index) {
  142. if (!mounted) {
  143. return;
  144. }
  145. _pageController.jumpToPage(index);
  146. },
  147. isScrollable: false,
  148. controller: _tabController,
  149. labelStyle: TextStyles.textBold18,
  150. indicatorSize: TabBarIndicatorSize.label,
  151. labelPadding: const EdgeInsets.only(left: 0),
  152. unselectedLabelColor: Colours.text_gray,
  153. labelColor: Colours.text_gray,
  154. // Theme.of(context).primaryColor,
  155. indicatorPadding:
  156. const EdgeInsets.only(left: 20.0, right: 20.0),
  157. tabs: tabs.map((map) {
  158. return _TabView(
  159. "${map["name"]}", "${mCount(map["id"])}", map["id"]);
  160. }).toList()),
  161. ),
  162. Gaps.line,
  163. Expanded(
  164. child: PageView.builder(
  165. key: const Key('pageView'),
  166. itemCount: tabs.length,
  167. onPageChanged: _onPageChange,
  168. controller: _pageController,
  169. itemBuilder: (BuildContext context, int index) {
  170. return Container(
  171. color: ThemeUtils.getBackgroundColor(context),
  172. child: mListView[index]);
  173. },
  174. ),
  175. )
  176. ],
  177. ),
  178. ),
  179. ));
  180. }
  181. Widget calendarWidget() {
  182. if (mCalendar == null) {
  183. mCalendar = Calendar(
  184. showTodayAction: false,
  185. showChevronsToChangeRange: true,
  186. showCalendarPickerIcon: false,
  187. onSelectedRangeChange: (range) {
  188. print("Range1 is ${range.item1}, ${range.item2}");
  189. _pageDate = range.item1;
  190. getCalenderDate();
  191. },
  192. onDateSelected: (res) {
  193. selectedDate = res;
  194. initHeaderTitle();
  195. print(_pageController.page);
  196. for(var i=0;i<mListView.length;i++){
  197. MaintenanceList widget = mListView[i];
  198. widget.date = res;
  199. }
  200. MaintenanceList widget = mListView[_pageController.page.toInt()];
  201. widget.date = res;
  202. if(widget.mState !=null){
  203. widget.mState.onRefresh();
  204. }
  205. setState(() {});
  206. print("currentSelected is ${mCalendar.currentSelected()}");
  207. print("Range2 is ${res}");
  208. },
  209. isExpandable: true,
  210. );
  211. }
  212. return mCalendar;
  213. }
  214. @override
  215. bool get wantKeepAlive => true;
  216. }
  217. class _TabView extends StatelessWidget {
  218. const _TabView(this.tabName, this.tabSub, this.index);
  219. final String tabName;
  220. final String tabSub;
  221. final int index;
  222. @override
  223. Widget build(BuildContext context) {
  224. return p.Consumer<MaintenancePageProvider>(
  225. builder: (_, provider, child) {
  226. bool isDark = ThemeUtils.isDark(context);
  227. return Tab(
  228. child: SizedBox(
  229. child: Row(
  230. crossAxisAlignment: CrossAxisAlignment.center,
  231. mainAxisAlignment: MainAxisAlignment.center,
  232. children: <Widget>[
  233. Container(
  234. margin: EdgeInsets.only(right: 3),
  235. width: 8,
  236. height: 8,
  237. decoration: BoxDecoration(
  238. color: index==0?Colors.grey:index==1?Colors.yellow:index==2?Color(0xFF9CD19E):Colors.red,
  239. borderRadius: BorderRadius.circular(4)
  240. ),
  241. ),
  242. Text(
  243. tabName,
  244. style: TextStyle(
  245. fontSize: 15,
  246. color: isDark ? Colours.dark_text : Colours.text),
  247. ),
  248. Padding(
  249. padding: const EdgeInsets.only(top: 1.0),
  250. child:
  251. Text(tabSub, style: TextStyle(fontSize: Dimens.font_sp12)),
  252. )
  253. ],
  254. ),
  255. ));
  256. },
  257. );
  258. }
  259. }