flutter_calendar.dart 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. import 'dart:async';
  2. import 'package:flutter/material.dart';
  3. import 'package:liftmanager/internal/maintenance/model/maintenance_count_item.dart';
  4. import 'package:liftmanager/res/resources.dart';
  5. import 'package:liftmanager/utils/utils.dart';
  6. import 'package:liftmanager/widgets/calendar/calendar_title.dart';
  7. import 'package:tuple/tuple.dart';
  8. typedef DayBuilder(BuildContext context, DateTime day);
  9. class Calendar extends StatefulWidget {
  10. final ValueChanged<DateTime> onDateSelected;
  11. final ValueChanged<Tuple2<DateTime, DateTime>> onSelectedRangeChange;
  12. final bool isExpandable;
  13. final DayBuilder dayBuilder;
  14. final bool showChevronsToChangeRange;
  15. final bool showTodayAction;
  16. final bool showCalendarPickerIcon;
  17. final DateTime initialCalendarDateOverride;
  18. Calendar(
  19. {this.onDateSelected,
  20. this.onSelectedRangeChange,
  21. this.isExpandable: false,
  22. this.dayBuilder,
  23. this.showTodayAction: true,
  24. this.showChevronsToChangeRange: true,
  25. this.showCalendarPickerIcon: true,
  26. this.initialCalendarDateOverride});
  27. final mCalendarState = CalendarState();
  28. today() {
  29. mCalendarState.resetToToday();
  30. }
  31. DateTime currentSelected(){
  32. return mCalendarState._selectedDate;
  33. }
  34. // updateState(int i){
  35. // mCalendarState.mtState = i;
  36. // }
  37. void updateState(List<MantenanceCountItem> arrCount) {
  38. mCalendarState.updateState(arrCount);
  39. }
  40. @override
  41. CalendarState createState() {
  42. return mCalendarState;
  43. }
  44. }
  45. class CalendarState extends State<Calendar> {
  46. final calendarUtils = new Utils();
  47. List<DateTime> selectedMonthsDays;
  48. Iterable<DateTime> selectedWeeksDays;
  49. DateTime _selectedDate = new DateTime.now();
  50. DateTime _selectedPageDate = new DateTime.now();
  51. String currentMonth;
  52. bool isExpanded = false;
  53. String displayMonth;
  54. List<MantenanceCountItem> arrCount = [];
  55. DateTime get selectedDate => _selectedDate;
  56. void initState() {
  57. super.initState();
  58. if (widget.initialCalendarDateOverride != null) {
  59. _selectedDate = widget.initialCalendarDateOverride;
  60. }
  61. _selectedPageDate = _selectedDate;
  62. selectedMonthsDays = Utils.daysInMonth(_selectedDate);
  63. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  64. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  65. selectedWeeksDays =
  66. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  67. .toList()
  68. .sublist(0, 7);
  69. displayMonth = Utils.formatMonth(_selectedDate);
  70. }
  71. Widget get nameAndIconRow {
  72. var leftInnerIcon;
  73. var rightInnerIcon;
  74. var leftOuterIcon;
  75. var rightOuterIcon;
  76. if (widget.showCalendarPickerIcon) {
  77. rightInnerIcon = new IconButton(
  78. onPressed: () => selectDateFromPicker(),
  79. icon: new Icon(Icons.calendar_today),
  80. );
  81. } else {
  82. rightInnerIcon = new Container();
  83. }
  84. if (widget.showChevronsToChangeRange) {
  85. leftOuterIcon = new IconButton(
  86. onPressed: isExpanded ? previousMonth : previousWeek,
  87. icon: new Icon(Icons.chevron_left),
  88. );
  89. rightOuterIcon = new IconButton(
  90. onPressed: isExpanded ? nextMonth : nextWeek,
  91. icon: new Icon(Icons.chevron_right),
  92. );
  93. } else {
  94. leftOuterIcon = new Container();
  95. rightOuterIcon = new Container();
  96. }
  97. if (widget.showTodayAction) {
  98. leftInnerIcon = new InkWell(
  99. child: Container(
  100. child: Image.asset("images/icon_today.png"),
  101. ),
  102. onTap: resetToToday,
  103. );
  104. } else {
  105. leftInnerIcon = new Container();
  106. }
  107. return Container(
  108. padding: EdgeInsets.only(left: 15, right: 15),
  109. decoration: BoxDecoration(
  110. color: Colours.app_main,
  111. gradient: const LinearGradient(
  112. colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]),
  113. ),
  114. child: Row(
  115. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  116. children: [
  117. rightInnerIcon ?? new Container(),
  118. rightOuterIcon ?? new Container(),
  119. new GestureDetector(
  120. onTap: () => selectDateFromPicker(),
  121. child: Text(
  122. displayMonth,
  123. style: new TextStyle(fontSize: 15.0, color: Colors.white),
  124. ),
  125. ),
  126. leftOuterIcon ?? new Container(),
  127. leftInnerIcon ?? new Container(),
  128. ],
  129. ));
  130. }
  131. Widget get calendarGridView {
  132. return new Container(
  133. child: new GestureDetector(
  134. onHorizontalDragStart: (gestureDetails) => beginSwipe(gestureDetails),
  135. onHorizontalDragUpdate: (gestureDetails) =>
  136. getDirection(gestureDetails),
  137. onHorizontalDragEnd: (gestureDetails) => endSwipe(gestureDetails),
  138. onVerticalDragStart: (gestureDetails) =>
  139. beginVerticalSwipe(gestureDetails),
  140. onVerticalDragUpdate: (gestureDetails) =>
  141. updateVerticalSwipe(gestureDetails),
  142. onVerticalDragEnd: (gestureDetails) => endVerticalSwipe(gestureDetails),
  143. child: new GridView.count(
  144. physics: NeverScrollableScrollPhysics(),
  145. //禁止GridView滚动事件,避免冲突
  146. shrinkWrap: true,
  147. crossAxisCount: 7,
  148. padding: new EdgeInsets.only(bottom: 0.0),
  149. children: calendarBuilder(),
  150. ),
  151. ),
  152. );
  153. }
  154. List<Widget> calendarWeek() {
  155. List<Widget> dayWidgets = [];
  156. Utils.weekdays.forEach(
  157. (day) {
  158. dayWidgets.add(
  159. new CalendarTile(
  160. // weekBgColor: Colors.white,
  161. dayOfWeekStyles: TextStyle(color: Colors.white),
  162. isDayOfWeek: true,
  163. dayOfWeek: day,
  164. ),
  165. );
  166. },
  167. );
  168. return dayWidgets;
  169. }
  170. List<Widget> calendarBuilder() {
  171. List<Widget> dayWidgets = [];
  172. List<DateTime> calendarDays =
  173. isExpanded ? selectedMonthsDays : selectedWeeksDays;
  174. // Utils.weekdays.forEach(
  175. // (day) {
  176. // dayWidgets.add(
  177. // new CalendarTile(
  178. //// weekBgColor: MyColors.app_main,
  179. // dayOfWeekStyles:TextStyle(color: Colors.white),
  180. // isDayOfWeek: true,
  181. // dayOfWeek: day,
  182. // ),
  183. // );
  184. // },
  185. // );
  186. bool monthStarted = false;
  187. bool monthEnded = false;
  188. calendarDays.forEach(
  189. (day) {
  190. if (monthStarted && day.day == 01) {
  191. monthEnded = true;
  192. }
  193. if (Utils.isFirstDayOfMonth(day)) {
  194. monthStarted = true;
  195. }
  196. if (this.widget.dayBuilder != null) {
  197. dayWidgets.add(
  198. new CalendarTile(
  199. child: this.widget.dayBuilder(context, day),
  200. date: day,
  201. onDateSelected: () => handleSelectedDateAndUserCallback(day),
  202. ),
  203. );
  204. } else {
  205. dayWidgets.add(
  206. new CalendarTile(
  207. onDateSelected: () => handleSelectedDateAndUserCallback(day),
  208. date: day,
  209. dateStyles: configureDateStyle(monthStarted, monthEnded),
  210. isSelected: "${_selectedDate.year},${_selectedDate.month}" ==
  211. "${_selectedPageDate.year},${_selectedPageDate.month}"
  212. ? Utils.isSameDay(selectedDate, day)
  213. : false,
  214. mtState: isMtState(day),
  215. ),
  216. );
  217. }
  218. },
  219. );
  220. return dayWidgets;
  221. }
  222. TextStyle configureDateStyle(monthStarted, monthEnded) {
  223. TextStyle dateStyles;
  224. if (isExpanded) {
  225. dateStyles = monthStarted && !monthEnded
  226. ? new TextStyle(color:Colours.dark_bg_gray, fontSize: 13)
  227. : new TextStyle(color: Colours.bg_gray, fontSize: 13);
  228. } else {
  229. dateStyles = new TextStyle(color: Colours.dark_bg_gray, fontSize: 13);
  230. }
  231. return dateStyles;
  232. }
  233. Widget get expansionButtonRow {
  234. if (widget.isExpandable) {
  235. return new Row(
  236. mainAxisAlignment: MainAxisAlignment.spaceBetween,
  237. children: <Widget>[
  238. new Text(Utils.fullDayFormat(selectedDate)),
  239. new IconButton(
  240. iconSize: 20.0,
  241. padding: new EdgeInsets.all(0.0),
  242. onPressed: toggleExpanded,
  243. icon: isExpanded
  244. ? new Icon(Icons.arrow_drop_up)
  245. : new Icon(Icons.arrow_drop_down),
  246. ),
  247. ],
  248. );
  249. } else {
  250. return new Container();
  251. }
  252. }
  253. @override
  254. Widget build(BuildContext context) {
  255. return new Container(
  256. child: new Column(
  257. mainAxisAlignment: MainAxisAlignment.start,
  258. mainAxisSize: MainAxisSize.min,
  259. children: <Widget>[
  260. nameAndIconRow,
  261. Container(
  262. decoration: BoxDecoration(color: Colours.app_main,
  263. gradient: const LinearGradient(
  264. colors: [Color(0xFF00D9FF), Color(0xFF0287FF)]),
  265. ),
  266. child: GridView.count(
  267. shrinkWrap: true,
  268. crossAxisCount: 7,
  269. padding: new EdgeInsets.only(bottom: 0.0),
  270. children: calendarWeek(),
  271. ),
  272. ),
  273. new ExpansionCrossFade(
  274. collapsed: calendarGridView,
  275. expanded: calendarGridView,
  276. isExpanded: isExpanded,
  277. ),
  278. // expansionButtonRow
  279. ],
  280. ),
  281. );
  282. }
  283. resetToToday() {
  284. print("resetToToday");
  285. _selectedDate = new DateTime.now();
  286. _selectedPageDate = _selectedDate;
  287. // if(isExpanded){
  288. var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedDate);
  289. var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedDate);
  290. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  291. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  292. setState(() {
  293. selectedWeeksDays =
  294. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  295. .toList();
  296. updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  297. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  298. displayMonth = Utils.formatMonth(_selectedDate);
  299. });
  300. // }else{
  301. // var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  302. // var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  303. // setState(() {
  304. // selectedWeeksDays =
  305. // Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  306. // .toList();
  307. // displayMonth = Utils.formatMonth(_selectedDate);
  308. // });
  309. // }
  310. _launchDateSelectionCallback(_selectedDate);
  311. }
  312. void nextMonth() {
  313. setState(() {
  314. // _selectedDate = Utils.nextMonth(_selectedDate);
  315. // var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedDate);
  316. // var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedDate);
  317. // updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  318. // selectedMonthsDays = Utils.daysInMonth(_selectedDate);
  319. // displayMonth = Utils.formatMonth(_selectedDate);
  320. _selectedPageDate = Utils.nextMonth(_selectedPageDate);
  321. var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedPageDate);
  322. var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedPageDate);
  323. updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  324. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  325. displayMonth = Utils.formatMonth(_selectedPageDate);
  326. });
  327. }
  328. void previousMonth() {
  329. setState(() {
  330. // _selectedDate = Utils.previousMonth(_selectedDate);
  331. // var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedDate);
  332. // var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedDate);
  333. // updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  334. // selectedMonthsDays = Utils.daysInMonth(_selectedDate);
  335. // displayMonth = Utils.formatMonth(_selectedDate);
  336. _selectedPageDate = Utils.previousMonth(_selectedPageDate);
  337. var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedPageDate);
  338. var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedPageDate);
  339. updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  340. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  341. displayMonth = Utils.formatMonth(_selectedPageDate);
  342. });
  343. }
  344. void nextWeek() {
  345. setState(() {
  346. // _selectedDate = Utils.nextWeek(_selectedDate);
  347. // var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  348. // var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  349. // updateSelectedRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek);
  350. // selectedWeeksDays =
  351. // Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  352. // .toList()
  353. // .sublist(0, 7);
  354. // displayMonth = Utils.formatMonth(_selectedDate);
  355. _selectedPageDate = Utils.nextWeek(_selectedPageDate);
  356. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedPageDate);
  357. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedPageDate);
  358. // var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedDate);
  359. // var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedDate);
  360. // updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  361. updateSelectedRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek);
  362. selectedWeeksDays =
  363. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  364. .toList()
  365. .sublist(0, 7);
  366. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  367. displayMonth = Utils.formatMonth(_selectedPageDate);
  368. });
  369. // _launchDateSelectionCallback(_selectedDate);
  370. _launchDateSelectionCallback(_selectedPageDate);
  371. }
  372. void previousWeek() {
  373. setState(() {
  374. // _selectedDate = Utils.previousWeek(_selectedDate);
  375. // var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  376. // var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  377. // updateSelectedRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek);
  378. // selectedWeeksDays =
  379. // Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  380. // .toList()
  381. // .sublist(0, 7);
  382. // displayMonth = Utils.formatMonth(_selectedDate);
  383. _selectedPageDate = Utils.previousWeek(_selectedPageDate);
  384. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedPageDate);
  385. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedPageDate);
  386. updateSelectedRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek);
  387. selectedWeeksDays =
  388. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  389. .toList()
  390. .sublist(0, 7);
  391. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  392. displayMonth = Utils.formatMonth(_selectedPageDate);
  393. });
  394. // _launchDateSelectionCallback(_selectedDate);
  395. _launchDateSelectionCallback(_selectedPageDate);
  396. }
  397. void updateSelectedRange(DateTime start, DateTime end) {
  398. var selectedRange = new Tuple2<DateTime, DateTime>(start, end);
  399. if (widget.onSelectedRangeChange != null) {
  400. widget.onSelectedRangeChange(selectedRange);
  401. }
  402. }
  403. Future<Null> selectDateFromPicker() async {
  404. DateTime selected = await showDatePicker(
  405. context: context,
  406. initialDate: _selectedDate ?? new DateTime.now(),
  407. firstDate: new DateTime(1960),
  408. lastDate: new DateTime(2050),
  409. );
  410. if (selected != null) {
  411. _selectedDate = selected;
  412. _selectedPageDate = _selectedDate;
  413. var firstDateOfNewMonth = Utils.firstDayOfMonth(_selectedDate);
  414. var lastDateOfNewMonth = Utils.lastDayOfMonth(_selectedDate);
  415. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(_selectedDate);
  416. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(_selectedDate);
  417. ///todo
  418. setState(() {
  419. selectedWeeksDays =
  420. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  421. .toList();
  422. updateSelectedRange(firstDateOfNewMonth, lastDateOfNewMonth);
  423. selectedMonthsDays = Utils.daysInMonth(_selectedPageDate);
  424. displayMonth = Utils.formatMonth(_selectedDate);
  425. });
  426. // updating selected date range based on selected week
  427. // updateSelectedRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek);
  428. _launchDateSelectionCallback(_selectedDate);
  429. }
  430. }
  431. var gestureStart;
  432. var gestureDirection;
  433. void beginSwipe(DragStartDetails gestureDetails) {
  434. gestureStart = gestureDetails.globalPosition.dx;
  435. }
  436. void getDirection(DragUpdateDetails gestureDetails) {
  437. if (gestureDetails.globalPosition.dx < gestureStart) {
  438. gestureDirection = 'rightToLeft';
  439. } else {
  440. gestureDirection = 'leftToRight';
  441. }
  442. }
  443. void endSwipe(DragEndDetails gestureDetails) {
  444. if (gestureDirection == 'rightToLeft') {
  445. if (isExpanded) {
  446. nextMonth();
  447. } else {
  448. nextWeek();
  449. }
  450. } else {
  451. if (isExpanded) {
  452. previousMonth();
  453. } else {
  454. previousWeek();
  455. }
  456. }
  457. }
  458. var gestureVertivalStart;
  459. var gestureVertivalDirection;
  460. void beginVerticalSwipe(DragStartDetails gestureDetails) {
  461. gestureVertivalStart = gestureDetails.globalPosition.dy;
  462. }
  463. void updateVerticalSwipe(DragUpdateDetails gestureDetails) {
  464. if (gestureDetails.globalPosition.dy < gestureVertivalStart) {
  465. gestureVertivalDirection = 'rightToTop';
  466. } else {
  467. gestureVertivalDirection = 'leftToBotton';
  468. }
  469. }
  470. void endVerticalSwipe(DragEndDetails gestureDetails) {
  471. if (gestureVertivalDirection == 'rightToTop') {
  472. if (widget.isExpandable) {
  473. setState(() => isExpanded = false);
  474. }
  475. } else {
  476. if (widget.isExpandable) {
  477. setState(() => isExpanded = true);
  478. }
  479. }
  480. }
  481. void toggleExpanded() {
  482. if (widget.isExpandable) {
  483. setState(() => isExpanded = !isExpanded);
  484. }
  485. }
  486. void handleSelectedDateAndUserCallback(DateTime day) {
  487. var firstDayOfCurrentWeek = Utils.firstDayOfWeek(day);
  488. var lastDayOfCurrentWeek = Utils.lastDayOfWeek(day);
  489. setState(() {
  490. _selectedDate = day;
  491. selectedWeeksDays =
  492. Utils.daysInRange(firstDayOfCurrentWeek, lastDayOfCurrentWeek)
  493. .toList();
  494. selectedMonthsDays = Utils.daysInMonth(day);
  495. });
  496. _launchDateSelectionCallback(day);
  497. }
  498. void _launchDateSelectionCallback(DateTime day) {
  499. if (widget.onDateSelected != null) {
  500. widget.onDateSelected(day);
  501. }
  502. }
  503. updateState(List<MantenanceCountItem> arrCount){
  504. this.arrCount = arrCount;
  505. setState(() {
  506. });
  507. }
  508. // TextStyle configureDateStyle(monthStarted, monthEnded) {
  509. // TextStyle dateStyles;
  510. // if (isExpanded) {
  511. // dateStyles = monthStarted && !monthEnded
  512. // ? new TextStyle(color: MyColors.ff_1a, fontSize: dip_f(13))
  513. // : new TextStyle(color: MyColors.ff_99, fontSize: dip_f(13));
  514. // } else {
  515. // dateStyles = new TextStyle(color: MyColors.ff_1a, fontSize: dip_f(13));
  516. // }
  517. // return dateStyles;
  518. // }
  519. int isMtState(DateTime dateTime) {
  520. if (_selectedPageDate.month != dateTime.month||_selectedPageDate.year != dateTime.year) {
  521. return 0;
  522. }
  523. int mtState = 0;
  524. for (int i = 0; i < arrCount.length; i++) {
  525. if(DateTime.parse('${arrCount[i].planDate}').day ==dateTime.day){
  526. if(arrCount[i].complete>0){
  527. mtState = 3;
  528. }
  529. if(arrCount[i].waitingMaintenance>0){
  530. mtState = 1;
  531. }
  532. if(arrCount[i].inProgress>0){
  533. mtState = 2;
  534. }
  535. if(arrCount[i].overdue>0){
  536. mtState = 4;
  537. }
  538. // if(arrCount[i].statuteOverdueCount>0||arrCount[i].overdueCount>0){
  539. // mtState = 4;
  540. // }
  541. }
  542. }
  543. return mtState;
  544. }
  545. }
  546. class ExpansionCrossFade extends StatelessWidget {
  547. final Widget collapsed;
  548. final Widget expanded;
  549. final bool isExpanded;
  550. ExpansionCrossFade({this.collapsed, this.expanded, this.isExpanded});
  551. @override
  552. Widget build(BuildContext context) {
  553. return new Flexible(
  554. flex: 1,
  555. child: new AnimatedCrossFade(
  556. firstChild: collapsed,
  557. secondChild: expanded,
  558. firstCurve: const Interval(0.0, 1.0, curve: Curves.fastOutSlowIn),
  559. secondCurve: const Interval(0.0, 1.0, curve: Curves.fastOutSlowIn),
  560. sizeCurve: Curves.decelerate,
  561. crossFadeState:
  562. isExpanded ? CrossFadeState.showSecond : CrossFadeState.showFirst,
  563. duration: const Duration(milliseconds: 100),
  564. ),
  565. );
  566. }
  567. }