weekly_calendar.dart 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import 'package:flutter/material.dart';
  2. import 'package:intl/date_symbol_data_local.dart';
  3. import 'package:shared/utils/log_utils.dart';
  4. import 'package:widgets/shatter/weekly_calendar/week_page.dart';
  5. import 'calendar_utils.dart' show getWeekdays;
  6. import 'day_of_week_view.dart';
  7. /// 总入口,整合顶部的Week控件与底部的Days的PageView控件
  8. class WeeklyCalendar extends StatefulWidget {
  9. const WeeklyCalendar({
  10. super.key,
  11. this.isAutoSelect = false,
  12. this.onChangedSelectedDate,
  13. this.onChangedPage,
  14. this.selectedDate,
  15. });
  16. final DateTime? selectedDate;
  17. final bool isAutoSelect;
  18. final Function(DateTime)? onChangedSelectedDate;
  19. final Function(DateTime date, PageState state)? onChangedPage;
  20. @override
  21. State<StatefulWidget> createState() => _WeeklyCalendarState();
  22. }
  23. class _WeeklyCalendarState extends State<WeeklyCalendar> {
  24. final DateTime now = DateTime.now();
  25. DateTime currentPageDate = DateTime.now();
  26. DateTime? selectedDate;
  27. @override
  28. void initState() {
  29. initializeDateFormatting("en"); //日期国际化指定
  30. super.initState();
  31. selectedDate = widget.selectedDate ?? DateTime.now();
  32. }
  33. @override
  34. void didUpdateWidget(covariant WeeklyCalendar oldWidget) {
  35. super.didUpdateWidget(oldWidget);
  36. if (widget.selectedDate != oldWidget.selectedDate) {
  37. setState(() {
  38. selectedDate = widget.selectedDate;
  39. });
  40. }
  41. }
  42. @override
  43. Widget build(BuildContext context) {
  44. return Column(
  45. mainAxisSize: MainAxisSize.min,
  46. children: [
  47. //顶部是固定的星期布局
  48. customDayOfWeek(),
  49. const SizedBox(height: 12),
  50. //底部是每个星期的Days的PageView布局
  51. WeekPage(
  52. selectedDate: selectedDate ?? DateTime.now(),
  53. //默认选中的日期,如果没有填写默认是今天
  54. now: now,
  55. //今天的日期
  56. isAutoSelect: widget.isAutoSelect,
  57. //翻页是否自动选中
  58. onChangedPage: (date, state) {
  59. setState(() {
  60. currentPageDate = date;
  61. });
  62. widget.onChangedPage?.call(date, state);
  63. },
  64. onChangedSelectedDate: (date) {
  65. setState(() {
  66. selectedDate = date;
  67. });
  68. widget.onChangedSelectedDate?.call(date);
  69. },
  70. ),
  71. ],
  72. );
  73. }
  74. //星期的文本显示
  75. Widget customDayOfWeek() {
  76. final weekdays = getWeekdays(now, 0);
  77. return DayOfWeekView(weekdays: weekdays);
  78. }
  79. }