maintenance_list_page.dart 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  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: Theme.of(context).primaryColor,
  154. indicatorPadding:
  155. const EdgeInsets.only(left: 20.0, right: 20.0),
  156. tabs: tabs.map((map) {
  157. return _TabView(
  158. "${map["name"]}", "${mCount(map["id"])}", map["id"]);
  159. }).toList()),
  160. ),
  161. Gaps.line,
  162. Expanded(
  163. child: PageView.builder(
  164. key: const Key('pageView'),
  165. itemCount: tabs.length,
  166. onPageChanged: _onPageChange,
  167. controller: _pageController,
  168. itemBuilder: (BuildContext context, int index) {
  169. return Container(
  170. color: ThemeUtils.getBackgroundColor(context),
  171. child: mListView[index]);
  172. },
  173. ),
  174. )
  175. ],
  176. ),
  177. ),
  178. ));
  179. }
  180. Widget calendarWidget() {
  181. if (mCalendar == null) {
  182. mCalendar = Calendar(
  183. showTodayAction: false,
  184. showChevronsToChangeRange: false,
  185. showCalendarPickerIcon: false,
  186. onSelectedRangeChange: (range) {
  187. print("Range1 is ${range.item1}, ${range.item2}");
  188. _pageDate = range.item1;
  189. getCalenderDate();
  190. },
  191. onDateSelected: (res) {
  192. selectedDate = res;
  193. initHeaderTitle();
  194. print(_pageController.page);
  195. for(var i=0;i<mListView.length;i++){
  196. MaintenanceList widget = mListView[i];
  197. widget.date = res;
  198. }
  199. MaintenanceList widget = mListView[_pageController.page.toInt()];
  200. widget.date = res;
  201. if(widget.mState !=null){
  202. widget.mState.onRefresh();
  203. }
  204. setState(() {});
  205. print("currentSelected is ${mCalendar.currentSelected()}");
  206. print("Range2 is ${res}");
  207. },
  208. isExpandable: true,
  209. );
  210. }
  211. return mCalendar;
  212. }
  213. @override
  214. bool get wantKeepAlive => true;
  215. }
  216. class _TabView extends StatelessWidget {
  217. const _TabView(this.tabName, this.tabSub, this.index);
  218. final String tabName;
  219. final String tabSub;
  220. final int index;
  221. @override
  222. Widget build(BuildContext context) {
  223. return p.Consumer<MaintenancePageProvider>(
  224. builder: (_, provider, child) {
  225. bool isDark = ThemeUtils.isDark(context);
  226. return Tab(
  227. child: SizedBox(
  228. child: Row(
  229. crossAxisAlignment: CrossAxisAlignment.center,
  230. mainAxisAlignment: MainAxisAlignment.center,
  231. children: <Widget>[
  232. Container(
  233. margin: EdgeInsets.only(right: 3),
  234. width: 8,
  235. height: 8,
  236. decoration: BoxDecoration(
  237. color: index==0?Colors.grey:index==1?Colors.yellow:index==2?Color(0xFF9CD19E):Colors.red,
  238. borderRadius: BorderRadius.circular(4)
  239. ),
  240. ),
  241. Text(
  242. tabName,
  243. style: TextStyle(
  244. fontSize: 15,
  245. color: isDark ? Colours.dark_text : Colours.text),
  246. ),
  247. Padding(
  248. padding: const EdgeInsets.only(top: 1.0),
  249. child:
  250. Text(tabSub, style: TextStyle(fontSize: Dimens.font_sp12)),
  251. )
  252. ],
  253. ),
  254. ));
  255. },
  256. );
  257. }
  258. }