Skip to content

Commit 46662d4

Browse files
feat:✨ Add theme support for multi day view
1 parent ddae87c commit 46662d4

18 files changed

+467
-153
lines changed

example/lib/main.dart

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,18 @@ class _MyAppState extends State<MyApp> {
2525
@override
2626
Widget build(BuildContext context) {
2727
return CalendarThemeProvider(
28-
calendarTheme: CalendarTheme(
28+
calendarTheme: CalendarThemeData(
2929
monthViewTheme:
30-
isDarkMode ? MonthViewTheme.dark() : MonthViewTheme.light(),
30+
isDarkMode ? MonthViewThemeData.dark() : MonthViewThemeData.light(),
3131
dayViewTheme: isDarkMode
32-
? DayViewTheme.dark()
33-
: DayViewTheme.light().copyWith(hourLineColor: AppColors.primary)
34-
as DayViewTheme,
32+
? DayViewThemeData.dark()
33+
: DayViewThemeData.light()
34+
.copyWith(hourLineColor: AppColors.primary) as DayViewThemeData,
3535
weekViewTheme:
36-
isDarkMode ? WeekViewTheme.dark() : WeekViewTheme.light(),
36+
isDarkMode ? WeekViewThemeData.dark() : WeekViewThemeData.light(),
37+
multiDayViewTheme: isDarkMode
38+
? MultiDayViewThemeData.dark()
39+
: MultiDayViewThemeData.light(),
3740
),
3841
child: CalendarControllerProvider(
3942
controller: EventController()..addAll(_events),

example/lib/theme/app_theme.dart

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,14 +48,16 @@ class AppTheme {
4848
);
4949

5050
// Light colors
51-
static final _dayViewTheme = DayViewTheme.light();
52-
static final _weekViewTheme = WeekViewTheme.light();
51+
static final _dayViewTheme = DayViewThemeData.light();
52+
static final _weekViewTheme = WeekViewThemeData.light();
53+
static final _multiDayViewTheme = MultiDayViewThemeData.light();
5354

5455
// Dark colors
5556
static final _appDarkTheme = AppThemeExtension.dark();
56-
static final _monthViewDarkTheme = MonthViewTheme.dark();
57-
static final _dayViewDarkTheme = DayViewTheme.dark();
58-
static final _weekViewDarkTheme = WeekViewTheme.dark();
57+
static final _monthViewDarkTheme = MonthViewThemeData.dark();
58+
static final _dayViewDarkTheme = DayViewThemeData.dark();
59+
static final _weekViewDarkTheme = WeekViewThemeData.dark();
60+
static final _multiDayViewDarkTheme = MultiDayViewThemeData.dark();
5961

6062
// Light theme
6163
static final light = ThemeData.light().copyWith(
@@ -81,6 +83,7 @@ class AppTheme {
8183
extensions: [
8284
_dayViewTheme,
8385
_weekViewTheme,
86+
_multiDayViewTheme,
8487
],
8588
);
8689

@@ -130,6 +133,7 @@ class AppTheme {
130133
_monthViewDarkTheme,
131134
_dayViewDarkTheme,
132135
_weekViewDarkTheme,
136+
_multiDayViewDarkTheme,
133137
],
134138
);
135139
}

example/lib/widgets/add_event_form.dart

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ class _AddOrEditEventFormState extends State<AddOrEditEventForm> {
103103
Text(
104104
'Recurring Event',
105105
style: TextStyle(
106-
color: AppColors.black,
106+
color: color.surface,
107107
fontSize: 16,
108108
),
109109
),
@@ -128,7 +128,7 @@ class _AddOrEditEventFormState extends State<AddOrEditEventForm> {
128128
}
129129
});
130130
},
131-
activeColor: Colors.blue,
131+
activeColor: color.surface,
132132
),
133133
],
134134
),
@@ -205,10 +205,10 @@ class _AddOrEditEventFormState extends State<AddOrEditEventForm> {
205205
updateWeekdaysSelection();
206206
}
207207

208-
if (mounted) {
209-
setState(() {});
210-
}
211-
},
208+
if (mounted) {
209+
setState(() {});
210+
}
211+
},
212212
validator: (value) {
213213
if (value == null || value == "") {
214214
return "Please select end date.";

lib/calendar_view.dart

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,11 @@ export './src/extensions.dart' hide BuildContextExtension;
1717
export './src/modals.dart';
1818
export './src/month_view/month_view.dart';
1919
export './src/style/header_style.dart';
20-
export './src/theme/calendar_theme.dart';
21-
export './src/theme/day_view_theme.dart';
22-
export './src/theme/month_view_theme.dart';
23-
export './src/theme/week_view_theme.dart';
20+
export './src/theme/calendar_theme_data.dart';
21+
export './src/theme/day_view_theme_data.dart';
22+
export './src/theme/month_view_theme_data.dart';
23+
export './src/theme/week_view_theme_data.dart';
24+
export './src/theme/multi_day_view_theme_data.dart';
2425
export './src/typedefs.dart';
2526
export './src/week_view/week_view.dart';
2627
export './src/multi_day_view/multi_day_view.dart';

lib/src/calendar_theme_provider.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class CalendarThemeProvider extends InheritedWidget {
1414
}) : super(key: key, child: child);
1515

1616
/// Theme for Calendar views.
17-
final CalendarTheme calendarTheme;
17+
final CalendarThemeData calendarTheme;
1818

1919
static CalendarThemeProvider of(BuildContext context) {
2020
final result =

lib/src/components/headers/month_page_header.dart

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,7 @@ class MonthPageHeader extends CalendarPageHeader {
2222
Color backgroundColor = Constants.headerBackground,
2323
StringProvider? dateStringBuilder,
2424
required DateTime date,
25-
HeaderStyle headerStyle =
26-
const HeaderStyle(),
25+
HeaderStyle headerStyle = const HeaderStyle(),
2726
}) : super(
2827
key: key,
2928
date: date,

lib/src/components/month_view_components.dart

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ class FilledCell<T extends Object?> extends StatelessWidget {
236236
}
237237
}
238238

239-
class WeekDayTile extends StatelessWidget {
239+
class WeekDayTile extends StatefulWidget {
240240
/// Index of week day.
241241
final int dayIndex;
242242

@@ -265,6 +265,11 @@ class WeekDayTile extends StatelessWidget {
265265
this.weekDayStringBuilder,
266266
}) : super(key: key);
267267

268+
@override
269+
State<WeekDayTile> createState() => _WeekDayTileState();
270+
}
271+
272+
class _WeekDayTileState extends State<WeekDayTile> {
268273
@override
269274
Widget build(BuildContext context) {
270275
final themeColors = context.monthViewColors;
@@ -274,17 +279,18 @@ class WeekDayTile extends StatelessWidget {
274279
margin: EdgeInsets.zero,
275280
padding: EdgeInsets.symmetric(vertical: 10.0),
276281
decoration: BoxDecoration(
277-
color: backgroundColor ?? themeColors.weekDayTileColor,
278-
border: displayBorder
282+
color: widget.backgroundColor ?? themeColors.weekDayTileColor,
283+
border: widget.displayBorder
279284
? Border.all(
280-
color: borderColor ?? themeColors.weekDayBorderColor,
285+
color: widget.borderColor ?? themeColors.weekDayBorderColor,
281286
width: 0.5,
282287
)
283288
: null,
284289
),
285290
child: Text(
286-
weekDayStringBuilder?.call(dayIndex) ?? Constants.weekTitles[dayIndex],
287-
style: textStyle ??
291+
widget.weekDayStringBuilder?.call(widget.dayIndex) ??
292+
Constants.weekTitles[widget.dayIndex],
293+
style: widget.textStyle ??
288294
TextStyle(
289295
fontSize: 17,
290296
fontWeight: FontWeight.w500,

lib/src/day_view/day_view.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -662,7 +662,7 @@ class DayViewState<T extends Object?> extends State<DayView<T>> {
662662
/// Default timeline builder this builder will be used if
663663
/// [widget.eventTileBuilder] is null
664664
///
665-
Widget _defaultTimeLineBuilder(date) => DefaultTimeLineMark(
665+
Widget _defaultTimeLineBuilder(DateTime date) => DefaultTimeLineMark(
666666
date: date,
667667
timeStringBuilder: widget.timeStringBuilder,
668668
markingStyle: TextStyle(

lib/src/extensions.dart

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,12 +319,45 @@ extension NullableCallback3<A, B, C> on void Function(A, B, C)? {
319319
}
320320

321321
extension BuildContextExtension on BuildContext {
322-
MonthViewTheme get monthViewColors =>
323-
Theme.of(this).extension<MonthViewTheme>() ?? MonthViewTheme.light();
322+
/// Get [MonthViewThemeData] from theme, if null returns light theme.
323+
/// [MonthViewThemeData] needs to be added in [MaterialApp] theme extensions
324+
/// to get theme data with this type.
325+
MonthViewThemeData get monthViewColors =>
326+
Theme.of(this).extension<MonthViewThemeData>() ??
327+
MonthViewThemeData.light();
328+
329+
/// Get [DayViewThemeData] from theme, if null returns light theme.
330+
/// [DayViewThemeData] needs to be added in [MaterialApp] theme extensions
331+
/// to get theme data with this type.
332+
DayViewThemeData get dayViewColors =>
333+
Theme.of(this).extension<DayViewThemeData>() ?? DayViewThemeData.light();
334+
335+
/// Get [WeekViewThemeData] from theme, if null returns light theme.
336+
/// [WeekViewThemeData] needs to be added in [MaterialApp] theme extensions
337+
/// to get theme data with this type.
338+
WeekViewThemeData get weekViewColors =>
339+
Theme.of(this).extension<WeekViewThemeData>() ??
340+
WeekViewThemeData.light();
341+
342+
/// Get [MultiDayViewThemeData] from theme, if null returns light theme.
343+
/// [MultiDayViewThemeData] needs to be added in [MaterialApp] theme extensions
344+
/// to get theme data with this type.
345+
MultiDayViewThemeData get multiDayViewColors =>
346+
Theme.of(this).extension<MultiDayViewThemeData>() ??
347+
MultiDayViewThemeData.light();
348+
}
324349

325-
DayViewTheme get dayViewColors =>
326-
Theme.of(this).extension<DayViewTheme>() ?? DayViewTheme.light();
350+
extension BuildContextMultiDayViewThemeExtension on BuildContext {
351+
/// Get MultiDayViewTheme from Theme
352+
MultiDayViewThemeData get multiDayViewTheme {
353+
final theme = Theme.of(this).extension<MultiDayViewThemeData>();
354+
if (theme != null) {
355+
return theme;
356+
}
327357

328-
WeekViewTheme get weekViewColors =>
329-
Theme.of(this).extension<WeekViewTheme>() ?? WeekViewTheme.light();
358+
// If no theme extension is available, return based on brightness
359+
return Theme.of(this).brightness == Brightness.dark
360+
? MultiDayViewThemeData.dark()
361+
: MultiDayViewThemeData.light();
362+
}
330363
}

lib/src/modals.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class LiveTimeIndicatorSettings {
5353
/// Flag to show time on live time line.
5454
final bool showTime;
5555

56-
/// Flag to show time backgroud view.
56+
/// Flag to show time background view.
5757
final bool showTimeBackgroundView;
5858

5959
/// Radius of bullet.

0 commit comments

Comments
 (0)