1
0

w_horizontal_month.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. import 'package:flutter/material.dart';
  2. import 'package:jiffy/jiffy.dart';
  3. import 'package:tp5/roster/widgets/w_month.dart';
  4. import 'package:scroll_to_index/scroll_to_index.dart';
  5. class HorizontalMonth extends StatefulWidget {
  6. const HorizontalMonth(
  7. {super.key,
  8. required this.start,
  9. required this.end,
  10. required this.onmonthclick,
  11. required this.selectedmonth});
  12. final Jiffy start;
  13. final Jiffy end;
  14. final void Function(Jiffy date) onmonthclick;
  15. final List<Jiffy> selectedmonth;
  16. @override
  17. State<HorizontalMonth> createState() => _WMonthsState();
  18. }
  19. class _WMonthsState extends State<HorizontalMonth> {
  20. final AutoScrollController scrollCtrl = AutoScrollController();
  21. List<Jiffy> dates = [];
  22. @override
  23. void initState() {
  24. Jiffy ijiffy = widget.start;
  25. while (ijiffy.isSameOrBefore(widget.end)) {
  26. if (!(dates
  27. .map((Jiffy e) => e.format(pattern: "MMMyy"))
  28. .contains(ijiffy.format(pattern: "MMMyy")))) {
  29. dates.add(ijiffy);
  30. }
  31. ijiffy = ijiffy.add(days: 1);
  32. }
  33. dates = dates.reversed.toList();
  34. int index = 0;
  35. for (var date in dates) {
  36. if ((widget.selectedmonth).any((month) =>
  37. month.isSameOrAfter(date.startOf(Unit.month)) &&
  38. month.isSameOrBefore(date.endOf(Unit.month)))) {
  39. break;
  40. }
  41. index++;
  42. }
  43. Future.delayed(const Duration(milliseconds: 300)).then((value) =>
  44. scrollCtrl.scrollToIndex(index,
  45. duration: const Duration(milliseconds: 1000),
  46. preferPosition: AutoScrollPosition.middle));
  47. super.initState();
  48. }
  49. @override
  50. Widget build(BuildContext context) {
  51. return SizedBox(
  52. height: 90,
  53. child: ListView.builder(
  54. controller: scrollCtrl,
  55. padding: const EdgeInsets.all(5),
  56. scrollDirection: Axis.horizontal,
  57. itemCount: dates.length,
  58. itemBuilder: (_, i) => AutoScrollTag(
  59. key: ValueKey(i),
  60. controller: scrollCtrl,
  61. index: i,
  62. child: InkWell(
  63. onTap: () => widget.onmonthclick(dates.elementAt(i)),
  64. child: WMonth(
  65. date: dates.elementAt(i),
  66. selected: widget.selectedmonth.any((Jiffy j) => (j
  67. .isSameOrAfter(
  68. dates.elementAt(i).startOf(Unit.month)) &&
  69. j.isSameOrBefore(dates.elementAt(i).endOf(Unit.month)))),
  70. ),
  71. ))),
  72. );
  73. }
  74. }