flutter_calendar.dart 20 KB

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