calendar_page.dart
2.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
// Copyright 2019 Aleksander Woźniak
// SPDX-License-Identifier: Apache-2.0
import 'package:flutter/widgets.dart';
class CalendarPage extends StatelessWidget {
final Widget Function(BuildContext context, DateTime day)? dowBuilder;
final Widget Function(BuildContext context, DateTime day) dayBuilder;
final Widget Function(BuildContext context, DateTime day)? weekNumberBuilder;
final List<DateTime> visibleDays;
final Decoration? dowDecoration;
final Decoration? rowDecoration;
final TableBorder? tableBorder;
final EdgeInsets? tablePadding;
final bool dowVisible;
final bool weekNumberVisible;
final double? dowHeight;
const CalendarPage({
super.key,
required this.visibleDays,
this.dowBuilder,
required this.dayBuilder,
this.weekNumberBuilder,
this.dowDecoration,
this.rowDecoration,
this.tableBorder,
this.tablePadding,
this.dowVisible = true,
this.weekNumberVisible = false,
this.dowHeight,
}) : assert(!dowVisible || (dowHeight != null && dowBuilder != null)),
assert(!weekNumberVisible || weekNumberBuilder != null);
@override
Widget build(BuildContext context) {
return Padding(
padding: tablePadding ?? EdgeInsets.zero,
child: Row(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
if (weekNumberVisible) _buildWeekNumbers(context),
Expanded(
child: Table(
border: tableBorder,
children: [
if (dowVisible) _buildDaysOfWeek(context),
..._buildCalendarDays(context),
],
),
),
],
),
);
}
Widget _buildWeekNumbers(BuildContext context) {
final rowAmount = visibleDays.length ~/ 7;
return Column(
children: [
if (dowVisible) SizedBox(height: dowHeight ?? 0),
...List.generate(
rowAmount,
(index) => Expanded(
child: weekNumberBuilder!(context, visibleDays[index * 7]),
),
),
],
);
}
TableRow _buildDaysOfWeek(BuildContext context) {
return TableRow(
decoration: dowDecoration,
children: List.generate(
7,
(index) => dowBuilder!(context, visibleDays[index]),
),
);
}
List<TableRow> _buildCalendarDays(BuildContext context) {
final rowAmount = visibleDays.length ~/ 7;
return List.generate(
rowAmount,
(index) => TableRow(
decoration: rowDecoration,
children: List.generate(
7,
(id) => dayBuilder(context, visibleDays[index * 7 + id]),
),
),
);
}
}