NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #1481 most downloaded on pub.dev
A highly customizable calendar widget with day, multi-day, month and schedule views, drag-and-drop rescheduling, event resizing, and timezone support.
Last release 8 days ago
30 Sep 2026
Ships fairly regularly
a new release about every 2 weeks
Nearly every release is documented
notes for 56 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
3 years old
117 releases · first in 2023
One column per quarter.
kDefaultToMonthly, kDefaultToWeekly, kDefaultToDaily and kDefaultToSchedule are deprecated and are removed in 0.34.0. Use ViewController.snapshot.
See MIGRATION.md for what to change.
ScheduleViewController.itemCount, item, addItem, clear and initialScrollIndex are removed.DefaultEventStore.dateIds is removed.EventLayoutDelegate.calculateHeight and calculateDistanceFromStart are removed.kDefaultNewEventDuration is removed.ResizeHandleDetails.continuesBefore, continuesAfter, showStart and showEnd are getters, and their location parameter is removed.events, tileHeight, getMultiDayEventLayoutRenderBox and overlayTileBuilder parameters of MultiDayOverlayPortal are removed.MultiDayOverlayPortalBuilder no longer passes getMultiDayEventLayoutRenderBox and overlayTileBuilder.ViewConfiguration has an abstract createViewController, which a class that extends it directly implements.MultiDayViewController, MonthViewController, ScheduleViewController, ContinuousScheduleViewController and PaginatedScheduleViewController take initial, a ViewSnapshot. Their initialDate, initialTimeOfDayOverride and initialHeightPerMinute are removed.ViewController.location is final.ViewController takes initialVisibleRange in place of floatingVisibleRange, and the view controllers no longer take floatingVisibleRange or visibleEvents. Each creates its own, and KalenderController forwards those of KalenderController.viewController.ViewController.floatingVisibleRange, KalenderController.floatingVisibleRange and visibleDateTimeRange, and the visible range a TimeLineBuilder receives are never null.ViewController.visibleEvents is a final field.ViewController.dispose disposes the visible range and visible events, and an override calls super.dispose().KalenderController.floatingVisibleRange, visibleDateTimeRange, visibleTimeOfDay and visibleEvents are ValueListenables.TimeLineBuilder, MultiDayBodyComponents.buildTimeline and TimeLine take the visible range as a ValueListenable.KalenderController takes viewConfiguration and location, and KalenderView no longer does.KalenderController.attach, detach, isAttached and isAttachedTo are removed, and viewController is never null.KalenderView.header and body are replaced by views, which defaults to KalenderView.defaultViews: a MultiDayViewParts, a MonthViewParts and a ScheduleViewParts.KalenderBody, KalenderHeader and ScheduleHeader are removed.MonthBody.configuration is a MonthBodyConfiguration and MultiDayHeader.configuration a MultiDayHeaderConfiguration.TileComponents.mergeSemantics turns this off.KalenderView built again on the same KalenderController opens on the date, scroll and zoom the previous one showed.EventLayoutStrategy.sideBySide() gives a group of tiles as many columns as it has events running at once and puts each tile in the first free column.kDefaultToMonthly, kDefaultToWeekly, kDefaultToDaily and kDefaultToSchedule are deprecated and are removed in 0.34.0. Use ViewController.snapshot.EventLayoutDelegate.findLongestChain is deprecated and is removed in 0.34.0.ViewController.snapshot returns the date, time of day and zoom a view shows.ViewConfiguration.resolveDate returns the date a new view controller opens on.ViewTransitionContext.location is the location the new view controller is created in.KalenderController.viewConfiguration or location switches the view.ViewTransitionContext.target is where the new view opens, and takes precedence over the transition settings and resolvers.KalenderController navigation works before a KalenderView is mounted and sets the date the view opens on.ViewParts pairs a header and a body with a kind of ViewConfiguration.KalenderScope.viewControllerOf and maybeViewControllerOf return the view controller of the surrounding KalenderView.MultiDayBody, MultiDayHeader, MonthBody and ScheduleBody take callbacks, interaction and tileComponents, MonthHeader takes callbacks, and MultiDayBody takes snapping.KalenderView.interaction sets the interaction for every view, and each view's widgets can override it.SideBySideLayoutDelegate.arrange returns the column of each tile as a SideBySidePlacement.MultiDayViewConfiguration, MonthViewConfiguration or ScheduleViewConfiguration no longer throws when the calendar builds.MultiDayViewController disposes heightPerMinute and pageOffset, and PaginatedScheduleViewController its PageController.KalenderController.dispose disposes its view controllers, visibleDateTimeRange and selectedEvent, and a view controller is disposed once no KalenderView shows it.KalenderViews mounted on one KalenderController, for example during a route transition, each keep the view controller they show.KalenderView no longer notifies the listeners of its KalenderController during the build.timeOfDayRange when the requested time of day is outside it.KalenderController.viewController no longer writes to KalenderController.visibleEvents and floatingVisibleRange.KalenderController.visibleEvents holds only the events of the page on screen.minimumTileHeight stretches tiles at a low zoom.KalenderController.visibleEvents.KalenderController.visibleEvents during the build.tileWhenDraggingBuilder and hides its resize handles while it is dragged.DefaultEventsController use the dates of the new timezone.ScheduleBodyConfiguration.emptyDay keeps the schedule on the date it shows.animateToDateTime and animateToEvent scroll a mounted multi-day view to the time of day in the calendar's location.KalenderView given another eventsController shows its events in the multi-day and month views.visibleEvents in the month view.visibleEvents when the events of the body change.MultiDayBodyConfiguration.showMultiDayEvents updates visibleEvents.visibleTimeOfDay holds the time at the top of the viewport when a multi-day view opens on a time it cannot scroll to..ics text.Nothing published for this version
The events, tileHeight, getMultiDayEventLayoutRenderBox and overlayTileBuilder parameters of MultiDayOverlayPortal are deprecated and are removed in 0…
events, tileHeight, getMultiDayEventLayoutRenderBox and overlayTileBuilder parameters of MultiDayOverlayPortal are deprecated and are removed in 0.33.0. The calendar builds the overlay.location parameter of ResizeHandleDetails.continuesBefore, continuesAfter, showStart and showEnd is deprecated and is removed in 0.33.0. The details carry the location.EventLayoutDelegate.calculateHeight and calculateDistanceFromStart are deprecated and are removed in 0.33.0. Use calculateVerticalLayoutData.kDefaultNewEventDuration is deprecated and is removed in 0.33.0. Nothing reads it.DefaultEventStore.dateIds is deprecated and is removed in 0.33.0. It was never populated.ScheduleViewController.itemCount, item, addItem, clear and initialScrollIndex are deprecated and are removed in 0.33.0. Pass a page, currentPage for the one on screen, to itemCountForPage, indexItem, addItemForPage and clearPage. closestIndex replaces initialScrollIndex.KalenderController.selectDate, selectRange and deselectRange select days, selectedRange holds the selection and isDateSelected checks a date against it.DayNumberStyle.selectedBackgroundColor, selectedForegroundColor, selectedBorder and todayBorder style a selected day number and today. A selected day gets a ring by default.KalenderCallbacks.dateLabel and weekNumber report taps, secondary taps and long presses on date labels and week numbers, through GestureCallbacks.onTapped callbacks.KalenderController.showDayOverlay and hideDayOverlay open and close the overlay of any visible day in the month view and the multi-day header, and openDayOverlay holds the open day.ResizeHandleDetails.location holds the calendar's location. continuesBefore, continuesAfter, showStart and showEnd compare the event in it.onTapped.calculateVerticalLayoutData, the positions the tiles are drawn at.kDefaultToWeekly and kDefaultToSchedule carry the first day of the month when switching from the month view.DaySeparatorStyle.topIndent and bottomIndent shorten the separator from the top and the bottom, not from the sides.OverlapLayoutDelegate.sortEvents keeps the duration-then-start order for more than 32 events.MultiDayViewConfiguration.copyWith keeps initialHeightPerMinute instead of resetting it to the default.examples/example/lib/selection_demo.dart shows date selection and opening the day overlay.Nothing published for this version
Nothing published for this version
KalenderCallbacks.copyWith keeps onWillAcceptWithDetailsVertical and onWillAcceptWithDetailsHorizontal. It took neither and forwarded neither, so a co
KalenderCallbacks.copyWith keeps onWillAcceptWithDetailsVertical and onWillAcceptWithDetailsHorizontal. It took neither and forwarded neither, so a copy dropped both.KalenderController.animateToEvent passes pageDuration, pageCurve, scrollDuration and scrollCurve to the view controller. It accepted all four and forwarded none.DayNumberStyle.todayForegroundColor colors the today number. The number text set its own color, which took precedence.The today highlight behind a day number can be styled through KalenderThemeData.dayNumberStyle. It read the Material ColorScheme directly, so nothing
KalenderThemeData.dayNumberStyle. It read the Material ColorScheme directly, so nothing could change it.fonts.gstatic.com on every load, and points fontFallbackBaseUrl at its own origin.dart fix --apply reaches back to 0.28.0: the twelve default* constants that took a k prefix, CreateEventGesture, and the two tap callback typedefs tha
dart fix --apply reaches back to 0.28.0: the twelve default* constants that took a k prefix, CreateEventGesture, and the two tap callback typedefs that lost their plural.dart fix --apply renames CalendarEvent.copyWith to copyWithData, from 0.26.0.0, which is a hairline. It has drawn nothing since 0.25.0.MIGRATION.md names the diagnostics to pass to dart fix --code, and says that a const call of a renamed class, and a parameter added to a method you override, are not rewritten.MIGRATION.md covers calling toDateTime on a Material TimeOfDay of your own, and a builder passed as a constructor tear-off.doc/layout.md states that a custom performLayout must guard layoutChild and positionChild with hasChild.layoutChild and positionChild with hasChild, so it no longer asserts when a tile is culled.The deprecated BuildContext.calendarLocale is removed.
See MIGRATION.md for what to change.
InternalDateTime is renamed to FloatingDateTime.InternalDateTimeRange is renamed to FloatingDateTimeRange.KalenderTime.toInternalDateTime is renamed to toFloatingDateTime.KalenderEvent.internalStart, internalEnd and internalRange are renamed to floatingStart, floatingEnd and floatingRange.KalenderController.internalDateTimeRange is renamed to floatingVisibleRange.ViewController.internalVisibleRange is renamed to floatingVisibleRange, in the view controller constructors too.ScheduleViewController.highlightedDateTimeRange is renamed to highlightedRange.EventsController.eventsFromDateTimeRange is renamed to eventsInRange.EventStore.eventIdsFromDateTimeRange is renamed to eventIdsInRange.PageIndexCalculator.dateTimeRangeFromIndex, dateTimeRangeFromDate and internalRange are renamed to rangeFromIndex, rangeFromDate and floatingRange.EventTileUtils.internalTileRange is renamed to floatingTileRange.DragTargetUtilities.calculateDateTimeRangeFromStart and calculateDateTimeRangeFromEnd are renamed to calculateRangeFromStart and calculateRangeFromEnd.FloatingDateTimeRange.dateTimeRangeOnDate is renamed to rangeOnDate.ResizeHandleDetails, MultiDayLayoutFrame, MultiDayLayout, ScheduleTileHighlight and SchedulePositionList rename their dateTimeRange to range.MonthWeek.internalRange is renamed to floatingRange.MonthViewConfiguration.copyWith takes initialDateTime rather than selectedDate.MultiDayLayoutStrategy.generateFrame and defaultMultiDayFrameGenerator take visibleRange rather than visibleDateTimeRange.MultiDayEventOverlayTile takes floatingRange rather than dateTimeRange.KalenderDateTimeRange, KalenderTime, KalenderTimeRange, FloatingDateTime and FloatingDateTimeRange are final classes.BuildContext.calendarLocale is removed.initialDateTime only applies when the calendar is first built, not on a view switch or a location change.initialDateTime no longer moves a calendar that is already built.ViewTransitionContext.locationChanged says whether the resolvers run because the location changed.dart fix --apply applies this release's renames.MonthViewConfiguration.copyWith applies the initialDateTime it is given.MultiDayEventOverlayTile.tileKey matches the tiles in the multi-day overlay.timeOfDayRange.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
The deprecated CalendarView and CalendarViewState typedefs are removed.
See MIGRATION.md for what to change.
CalendarBody, CalendarCallbacks, CalendarComponents, CalendarController, CalendarEvent, CalendarHeader, CalendarInteraction and CalendarSnapping are renamed to Kalender*.CalendarLocale extension on BuildContext is renamed to KalenderLocale.KalenderView.calendarController is renamed to kalenderController.KalenderScope.calendarControllerOf and maybeCalendarControllerOf are renamed to kalenderControllerOf and maybeKalenderControllerOf.ViewController.visibleDateTimeRange is renamed to internalVisibleRange.CalendarView and CalendarViewState typedefs are removed.KalenderDateTimeRange replaces Material's DateTimeRange in every public signature.KalenderTime replaces Material's TimeOfDay in every public signature.TimeOfDayRange is renamed to KalenderTimeRange.KalenderTimeRange holds KalenderTime values.TimeOfDayStringBuilder is renamed to KalenderTimeStringBuilder.TimeOfDayExtension is removed.toInternalDateTime and toDateTime are methods on KalenderTime.InternalDateTimeRange no longer extends DateTimeRange.InternalDateTimeRange.forLocation returns a KalenderDateTimeRange.InternalDateTimeRange.overlaps takes an InternalDateTimeRange.InternalDateTimeRange.fromDateTimeRange takes a KalenderDateTimeRange.KalenderEvent and KalenderEvent.copyWithData take start and end rather than dateTimeRange.PageIndexCalculator and its subclasses take start and end rather than dateTimeRange.DragTargetUtilities.calculateDateTimeRangeFromStart and calculateDateTimeRangeFromEnd take an InternalDateTimeRange.EventTileUtils.eventRangeOnDate returns an InternalDateTimeRange.ResizeHandleDetails.dateTimeRange is an InternalDateTimeRange.onPageChanged in the calendar's location.monthItemBuilder and emptyItemBuilder receive ranges in the calendar's location.KalenderTime asserts that its hour and minute are within a day.KalenderController.id is unique to each controller.BuildContext.calendarLocale is renamed to kalenderLocale. The old name is removed in 0.31.0.DateTimeExtensions.timeLocalized formats the time of day for a locale, with use24HourFormat to force HH:mm.PageIndexCalculator.month and MonthIndexCalculator.fromRange build a month calculator from a range.package:kalender/material.dart converts KalenderDateTimeRange and KalenderTime to and from Material's DateTimeRange and TimeOfDay.dart fix --apply applies this release's renames and both parameter reshapes.dart fix does not apply the context.calendarLocale rename.intl where the app installs no MaterialLocalizations, rather than throwing. (#491)KalenderTimeRange.coversWholeDay is false for a range that starts after midnight.Nothing published for this version
dart fix --apply renames CalendarView to KalenderView and CalendarViewState to KalenderViewState.
dart fix --apply renames CalendarView to KalenderView and CalendarViewState to KalenderViewState.See MIGRATION.md for what to change.
See MIGRATION.md for what to change.
GutterStyles and GutterStyles.timelineStyleOf are removed.KalenderView.locale, KalenderScope.localeOf, BuildContext.calendarLocale and the four localized methods on DateTimeExtensions take a Locale rather than a dynamic.CalendarView is renamed to KalenderView, and CalendarViewState to KalenderViewState. The old names are typedefs, removed in 0.30.0.KalenderScope reads the state of the enclosing calendar, one accessor per value: eventsControllerOf, calendarControllerOf, localeOf, locationOf, componentsOf, callbacksOf, interactionOf, snappingOf, tileComponentsOf, heightPerMinuteOf and multiDayRuleOf, with maybeOf forms for the two controllers.MonthBodyComponents.weekNumberWidth takes a WeekNumberWidthBuilder sizing the month week number column, with defaultWeekNumberWidth and kDefaultWeekNumberWidth as the default.timelineWidth builder receives one range rather than the view's range in the body and TimeOfDayRange.allDay() in the header and the drag overlay.Nothing published for this version
See MIGRATION.md for what to change.
See MIGRATION.md for what to change.
FreeScrollFunctions is removed. Use DayIndexCalculator, which PageIndexCalculator.freeScroll returns.CreateEventGesture is renamed to EventInteractionGesture. The createEventGesture and modifyEventGesture fields keep their names.OnEventTapped and OnEventTappedWithDetail no longer take a RenderBox. Read it from TapDetail.renderBox.OnTappedWithDetails and OnLongPressedWithDetails lose the plural. The two OnWillAccept typedefs keep it.default* public top-level constants take a k prefix. The migration guide lists each one.WeekNumberStyle.visualDensity is replaced by Size? buttonSize, matching MonthDayHeaderStyle.buttonSize.MultiDayViewConfiguration.type is included in == and hashCode.ResizeHandleStyle sizes the resize handles through KalenderThemeData.resizeHandleStyle, with length for precise input and impreciseLength for a finger.Nothing published for this version
TimeOfDayRange.isAllDay is removed, as its 0.26.0 deprecation named. Use coversWholeDay. TimeOfDayRange.allDay() is unaffected.
See MIGRATION.md for what to change.
TimeOfDayRange.isAllDay is removed, as its 0.26.0 deprecation named. Use coversWholeDay. TimeOfDayRange.allDay() is unaffected.BuildContext first and no longer take a style: hourLines, timeline, timelineWidth, daySeparator and timeIndicator.null. MultiDayBodyComponents gained a buildX method per field.builder and fromContext are removed from TimeLine, HourLines, DaySeparator and TimeIndicator.defaultTimelineWidth no longer takes a TimelineStyle. It resolves one from the context.BuildContext first and no longer take a style: dayHeaderBuilder, weekNumberBuilder, weekDayHeaderBuilder, monthDayHeaderBuilder, monthGridBuilder and monthDayCellBuilder.null. MultiDayHeaderComponents, MonthHeaderComponents and MonthBodyComponents gained a buildX method per field.builder and fromContext are removed from DayHeader, WeekNumber, WeekDayHeader, MonthGrid, MonthDayHeader and MonthDayCell. MonthDayCell.shadeAdjacentMonths stays.BuildContext first: leadingDateBuilder, scheduleTileHighlightBuilder, emptyItemBuilder and monthItemBuilder. ScheduleComponents gained buildLeadingDate and buildScheduleTileHighlight, and ScheduleDate.builder and ScheduleTileHighlight.builder are removed.BuildContext first: tileBuilder, overlayTileBuilder, tileWhenDraggingBuilder, feedbackTileBuilder and dropTargetTile, along with the four default* functions.ResizeHandlePositioner takes a BuildContext and a ResizeHandleDetails and returns a Widget. ResizeHandles is removed, its six values and nine helpers moving to ResizeHandleDetails.ResizeHandles.startResizeDraggableKey and endResizeDraggableKey move to ResizeDetector, the widget they key.ResizeHandleDetails.resizeHandle resolves the handle widgets from the context rather than from a tileComponents field, and its axis is optional.ResizeHandles.builder is replaced by TileComponents.buildResizeHandles. DefaultResizeHandles takes a ResizeHandleDetails.BuildContext first: HorizontalTriggerWidgetBuilder and VerticalTriggerWidgetBuilder, covering leftTriggerBuilder, rightTriggerBuilder, topTriggerBuilder and bottomTriggerBuilder.BuildContext as their first positional argument: multiDayOverlayBuilder, multiDayOverlayPortalBuilder, multiDayPortalOverlayButtonBuilder and MultiDayOverlayEventTileBuilder. The first two drop their style parameter.OverlayStyles is removed. Read the two styles off KalenderTheme.of(context).weekNumberBuilder reads it with KalenderTheme.of(context).MultiDayEventOverlayTile is exported, so MultiDayOverlayEventTileBuilder can be implemented.ResizeDetector is exported. It carries event and direction, so a handle is findable with find.byType and a predicate rather than only by key.GutterStyles is public, with GutterStyles.timelineStyleOf, which resolves the style the gutter is measured from.Nothing published for this version
Nothing published for this version
The style fields on CalendarComponents are removed, as their 0.25.0 deprecation named: monthComponentStyles, multiDayComponentStyles, scheduleComponen…
See MIGRATION.md for what to change.
CalendarComponents are removed, as their 0.25.0 deprecation named: monthComponentStyles, multiDayComponentStyles, scheduleComponentStyles and overlayStyles. Use KalenderThemeData, or KalenderTheme to scope it to one calendar.MonthComponentStyles, MonthBodyComponentStyles, MonthHeaderComponentStyles, MultiDayComponentStyles, MultiDayBodyComponentStyles, MultiDayHeaderComponentStyles and ScheduleComponentStyles. OverlayStyles stays.eventLayoutStrategy, generateMultiDayLayoutFrame and eventSnapStrategy are classes rather than function typedefs, each with value equality and named factories for the built-ins: EventLayoutStrategy.overlap() and .sideBySide(), MultiDayLayoutStrategy.byDuration(), and EventSnapStrategy.interval(). #380HorizontalConfiguration.generateMultiDayLayoutFrame is renamed to multiDayLayoutStrategy and defaults to MultiDayLayoutStrategy.byDuration().CalendarEvent.copyWith is removed. Override copyWithData instead.CalendarEvent.interaction and CalendarEvent.multiDayRule are getters rather than fields.HourLines.fromContext no longer takes a style argument.style?.textStyle ?? myFallback reaches the theme value: dayHeaderBuilder, daySeparator, hourLines, monthDayHeaderBuilder, monthGridBuilder, timeIndicator, timeline, weekDayHeaderBuilder, weekNumberBuilder and leadingDateBuilder.MultiDayOverlayPortalBuilder receives a populated OverlayStyles, built by OverlayStyles.fromContext.KalenderThemeData.weekNumberStyle.alignment reaches the month week number, which ignored it before. #423weekNumberBuilder receives the same resolved style in the month header as in the month body. #423CalendarEvent.isAllDay places an event in the multi-day header lane whatever its duration, with no MultiDayRule consulted. It defaults to false and is included in layoutEquals and hashCode.PageIndexCalculator and its subclasses are exported. #444EventSnapStrategy.none() leaves a dragged event where the cursor is.defaultMultiDayFrameGenerator stays public, so a custom MultiDayLayoutStrategy can reuse the built-in row assignment.meta is a direct dependency at ^1.9.0, the version that introduced @mustBeOverridden.TimeOfDayRange.isAllDay is renamed to coversWholeDay and will be removed in 0.27.0. TimeOfDayRange.allDay() is unchanged.MultiDayViewConfiguration.week and .workWeek honour numberOfDays. Both built their page index calculator with a hardcoded 7 and 5, so every column sat out of line with its header. copyWith carries the value. #444weekNumberStyle or timelineStyle the calendar has to ignore is reported in debug builds.multiDayOverlayBuilder or multiDayPortalOverlayButtonBuilder receives the style resolved from the theme.MultiDayOverlayPortal.overlayStyles is optional.ThemeData rather than on every KalenderTheme.of call. The cache is keyed weakly on the theme.MultiDayBodyConfiguration.keepPagesAlive is included in == and hashCode.MonthBodyConfiguration and MultiDayHeaderConfiguration no longer compare equal to each other, and the same for the two VerticalConfiguration subclasses.MultiDayViewConfiguration.nowCallback is included in hashCode, where it was already included in ==.multiDayOverlayPortalBuilder, across the Overlay boundary it is built into.KalenderTheme scoped to the body cannot move the month week number gutter or the multi-day timeline, and that an ignored scoped value is reported once.copyWith, and the header's day count.Nothing published for this version
CalendarEvent.isMultiDayEvent is removed. It was deprecated in 0.24.0, which named this release. Use spansMultipleDays(location:, defaultRule:). See M…
See MIGRATION.md for what to change.
CalendarEvent.isMultiDayEvent is removed. It was deprecated in 0.24.0, which named this release. Use spansMultipleDays(location:, defaultRule:). See MIGRATION.md. #410KalenderTheme is a widget, so a theme can be applied to part of the tree instead of the whole app. Wrap a calendar in KalenderTheme(data: ..., child: ...) and two calendars in one app can look different. The nearest one wins when they nest, and fields it leaves out still come from the KalenderThemeData registered on ThemeData.extensions, which keeps working as before. It is an InheritedTheme, so the theme also reaches the tile that follows a drag, which is built into an Overlay rather than below the calendar. #414KalenderThemeData are Diagnosticable, so their resolved values appear in the Flutter devtools inspector and in toString() instead of a bare instance hash. Fields left unset are omitted rather than printed as null. #412CalendarComponents are deprecated and are removed in 0.26.0. Use KalenderThemeData for the whole app, or a KalenderTheme to scope one calendar. The same thirteen styles were reachable both ways, and multiDayOverlayStyle had four different homes. CalendarComponents keeps its builder fields. See MIGRATION.md. #416MonthBodyComponentStyles, so setting any week number style there replaced it. The month body now applies that alignment under your style, and keeps it unless you set an alignment of your own. In the month view a KalenderThemeData cannot change this alignment, because the style the month body passes to the widget takes precedence over the theme. The rest of WeekNumberStyle resolves from the theme as usual. #416 #419CalendarComponents, the containers reached through it, TileComponents and ScheduleTileComponents compare by value, and CalendarComponents can be const. The inherited widgets carrying them reported a change on every rebuild because they compared by identity, and now report one only when something differs. #409CalendarComponents and the containers reached through it gain copyWith. #409KalenderTheme: it applies below itself, takes precedence over the extension, and fills in from it field by field. The nearest scope wins when they nest, two calendars in one app can be themed differently, changing the data notifies dependents where an equal value does not, and wrap carries the theme into a tree built outside the calendar. #414Diagnosticable coverage for every style class: a style reports the fields it sets and omits the ones it does not, and the theme reports the styles it carries. #412CalendarComponents, the containers reached through it and TileComponents: each field breaks equality when it differs, a builder held as a top-level function stays equal across instances, and one written as a closure does not. #409KalenderThemeData coverage no test reached: hashCode, the fields == compares after the third, and one copyWith fallback. #408Nothing published for this version
The seven string builders deprecated in 0.23.0 are removed from the component style classes. Their replacements on the matching *Components classes ar…
See MIGRATION.md for what to change.
timezone package. Location and TZDateTime are still exported. Everything else, including getLocation and initializeTimeZones, now needs package:timezone imported directly. #375*Components classes are unchanged. See MIGRATION.md for the mapping. #372MonthDayHeaderStyle.textStyle is removed. It never had any effect. The day number is styled by numberTextStyle. #372CalendarCallbacks.onMultiDayTapped was never called, so deleting it changes nothing. DateTimeExtensions.monthNameEnglish and dayNameEnglish are replaced by monthNameLocalized('en') and dayNameLocalized('en'). #374EventsController.eventsFromDateTimeRange takes a required multiDayRule. This only affects code implementing EventsController. Pass the view configuration's rule. #371CalendarEvent.spansMultipleDays takes a required defaultRule alongside location. A subclass overriding it must widen its signature to match. #371ScheduleTileComponents no longer accepts dropTargetTile, overlayTileBuilder or resizeDragAnchorStrategy. None of them had any effect. Delete the arguments. To style the drop target, use ScheduleComponents.scheduleTileHighlightBuilder and ScheduleTileHighlightStyle. #381ScheduleTileComponents.emptyItemBuilder and monthItemBuilder are moved to ScheduleComponents. Set them on CalendarComponents.scheduleComponents instead. Signatures and defaults are unchanged. See MIGRATION.md. #383CalendarInteraction.throttleMilliseconds is removed. Drag updates are now combined into one per frame and follow the display's refresh rate. Nothing replaces it. Delete the argument. #368DragTargetUtilities can only be applied to a State. It supplies context and mounted itself instead of requiring them from the host. A class applying the mixin to a State needs no change. Anything else no longer compiles. #368MultiDayRule decides which events belong in the multi-day header rather than the day timeline. Set it once on the view configuration. MultiDayRule.minimumDuration at 24 hours is the default and matches the previous behavior. MultiDayRule.calendarDays treats anything crossing midnight as multi-day. A single event can override the rule with CalendarEvent.multiDayRule. #367 #371 #376copyWith forwarded id and multiDayRule. copyWith takes no parameter for either, so an override that omits them drops them on every copy, silently until selection or multi-day placement goes wrong. The message names the subclass and the argument to add. #367CalendarEvent.isMultiDayEvent is replaced by spansMultipleDays(location:). The getter measured calendar days in UTC. It will be removed in 0.25.0. See MIGRATION.md. #367PageIndexCalculator and ScheduleViewConfiguration had no ==. At 50 events a day, five rebuilds went from 105 vertical layout computations to none. #404ViewConfiguration.nowCallback is included in ==. Pass a top-level or static function. #404CalendarView attaches to a replaced calendarController instead of staying on the old one. #404CalendarInteraction and HorizontalConfiguration compare every field in ==. Four fields were missing, so changing only one of them never updated the calendar. #364CalendarSnapping compares and copies eventSnapStrategy. Changing only the strategy had no effect, and copyWith reset it to defaultSnapStrategy. Pass a top-level or static function. #402ScrollTriggerConfiguration.copyWith keeps scrollAmount instead of resetting it to the default. #366MultiDayViewConfiguration.copyWith and MonthViewConfiguration.copyWith keep multiDayRule instead of resetting it to the default, and take a parameter to change it. MonthViewConfiguration.copyWith also keeps nowCallback and no longer takes an eventPadding parameter, which set nothing. #387initializeDateFormatting() call to add and the library it comes from, instead of throwing intl's LocaleDataException from inside a build. #382TileComponents.overlayTileBuilder is used again by the tiles in the multi-day overflow overlay. It had been ignored since 0.14.0. #381CalendarEvent.hashCode is built from id, start, end, interaction and multiDayRule, so this needs a custom EventsController that gives two events the same id. #370VerticalConfiguration and HorizontalConfiguration breaks equality when it differs, two configurations built from the same arguments compare equal, and nowCallback, initialTimeOfDay and initialHeightPerMinute take part. #364 #404copyWith round-trip coverage for the view and body configurations, so a field that is not being changed survives the copy. #366 #387hashCode ignores the id, and when the cache is already warm. #370copyWith drops id or multiDayRule, and stays silent for an override that forwards both. #367TileComponents.overlayTileBuilder renders the overflow overlay tiles, and falls back to tileBuilder when it is not set. #381Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing in this release stops existing code from compiling. See MIGRATION.md for what to change.
Nothing in this release stops existing code from compiling. See MIGRATION.md for what to change.
Each of these changes what an unchanged calendar renders.
+3 instead of 3 more, with the number formatted for the calendar's locale so locales with their own numerals read correctly. #349DateFormat.E instead of cutting the full name at three characters, which was only correct in English. German reads Mi rather than Mit. #354MonthDayHeaderStyle.stringBuilder was declared but never called. Its replacement is wired up, so a calendar that set the old field will now see the day number change. #349MonthBodyComponents.overlayBuilders defaults to null, so CalendarComponents.overlayBuilders applies in the month view instead of being shadowed by an empty default. The builder-side twin of the style-side fix in 0.22.0. #349Both are removed in 0.24.0.
*Components classes and gained a BuildContext parameter, so a custom builder can read the calendar's locale. The old fields still apply when the new one is not set. #349MonthDayHeaderStyle.textStyle has never had any effect. MonthDayHeader renders only a day number, styled by numberTextStyle. #354context.calendarLocale reads the locale of the enclosing calendar, which is not necessarily the app's. #349EventsController gained replaceEvents, which swaps the whole event set in one call. DefaultEventsController does it atomically: a single notification and no intermediate empty state, which suits reloading events from a source such as an imported .ics file. The base class provides a default that clears then adds, so custom controllers keep working unchanged. #344MultiDayLayoutFrame gained an optional textDirection, which defaults to left to right, so a custom frame generator is unaffected. #334MultiDayOverlayStyle gained cardTheme, closeButtonStyle, barrierColor, width, and headerHeight, so the overlay card, its close button, and the area be
MultiDayOverlayStyle gained cardTheme, closeButtonStyle, barrierColor, width, and headerHeight, so the overlay card, its close button, and the area behind it can be styled to match the rest of the app. The card and button take Flutter's own CardThemeData and ButtonStyle. All of them default to null, so the stock appearance is unchanged. #325monthComponents/monthComponentStyles instead of letting the global CalendarComponents.overlayBuilders and overlayStyles shadow them. This matches what CalendarComponents documents and what the multi-day header already did. Only apps that set both are affected. #323All component style classes (DayHeaderStyle, TimelineStyle, HourLinesStyle, and the rest) now support copyWith, merge, lerp, and value equality. This
DayHeaderStyle, TimelineStyle, HourLinesStyle, and the rest) now support copyWith, merge, lerp, and value equality. This is groundwork for the upcoming theme extension. #314KalenderThemeData, a ThemeExtension with one field per component style, and KalenderTheme.of(context), which resolves it against centralized Material 3 defaults. Register it on ThemeData.extensions to style every calendar in the app, with animated theme changes supported. #315KalenderThemeData takes effect everywhere. Two defaults changed on purpose: the time indicator line uses the color scheme's error color instead of always red, and the day number text in the month body and schedule view defaults to bodyMedium instead of being unstyled. #316MonthDayHeaderStyle.margin and MonthDayHeaderStyle.buttonSize fields. #320MultiDayOverlayStyle.eventPadding is now applied to each event in the overlay. It was ignored, and eventsPadding was used for both the event list and each individual event. #316Multi-day and all-day events now render in the free-scroll view as a single tile spanning the day columns, instead of being split at each page boundar
PageTriggerConfiguration.triggerWidth is now applied. It was accepted but ignored, and copyWith dropped it, so the edge strip that starts a page change while dragging was always pageWidth / 50. That is still the default, but it can now be set. #302Added MultiDayBodyConfiguration.keepPagesAlive (default false). When enabled, each visited multi-day page is kept alive and reused, so navigating back
MultiDayBodyConfiguration.keepPagesAlive (default false). When enabled, each visited multi-day page is kept alive and reused, so navigating back to it skips rebuilding every event tile. It is opt-in because cached pages stay in memory for the lifetime of the view. #293visibleEvents notifier now only publishes when the set of visible events actually changes, avoiding redundant work for listeners. #290monthDayHeaderBuilder now receives a localized wall-clock DateTime instead of a UTC-flagged InternalDateTime, matching dayHeaderBuilder. #248
monthDayHeaderBuilder now receives a localized wall-clock DateTime instead of a UTC-flagged InternalDateTime, matching dayHeaderBuilder. #248ViewConfiguration.initialDateSelectionStrategy with per-dimension view-transition options: dateTransition on all views, and scrollTransition / zoomTransition on MultiDayViewConfiguration, each with an optional resolver for custom logic. #249initialTimeOfDay. Opt out with ScrollTransition.reset / ZoomTransition.reset. #249EmptyDayBehavior.showToday to EmptyDayBehavior.showOnlyToday, since it shows only today among empty days. #253MultiDayBodyComponents.prototypeTimeLine with a timelineWidth builder that returns the gutter width directly (double). The multi-day body, header and drag overlay now share this one width, so customizing the timeline can no longer misalign the header. Removed the PrototypeTimeline widget and PrototypeTimeLineBuilder. #180restorePerView transitions so each view can reopen its own last date, scroll, and zoom. #249CalendarController.visibleTimeOfDay and the CalendarCallbacks.onScrollPositionChanged callback. #249ScheduleBodyConfiguration.leadingWidth to control the schedule view's date-column width. #253TimelineStyle.width to set an explicit multi-day timeline gutter width. #180MonthBodyComponents.monthDayCellBuilder to style individual month-view day cells. Each call reports the cell's date, whether it is today, and whether it falls in the focused month (so adjacent-month days can be styled differently). Also added the ready-made MonthDayCell.shadeAdjacentMonths() builder, which shades leading/trailing adjacent-month days. Pass a color or let it default to a low-opacity onSurface overlay that greys them out. #140eventPadding to MonthBodyConfiguration (forwarded from the constructor and through copyWith), so month event tiles can be spaced like MultiDayHeaderConfiguration already allows. #252animateToDateTime now target today, or the nearest day when it is hidden. #253stringBuilder or width. The gutter width now has a single source. #180CalendarView regression coverage for the time indicator, run across the timezone matrix. #261CalendarView today-highlighting coverage, run across the timezone matrix. #254 #251generateMultiDayLayoutFrame. #235monthDayCellBuilder is invoked per day with the correct focused-month flags, and that MonthDayCell.shadeAdjacentMonths() shades only the adjacent-month days. #140Fixed a blank page when a displayRange spanned exactly one month, and the same off-by-one page count that dropped the final in-range page in the week,
displayRange spanned exactly one month, and the same off-by-one page count that dropped the final in-range page in the week, custom multi-day, and paginated schedule views. #266Added optional month-view week numbers via MonthViewConfiguration.showWeekNumbers, with customizable MonthBodyComponents.weekNumberBuilder and MonthBo
MonthViewConfiguration.showWeekNumbers, with customizable MonthBodyComponents.weekNumberBuilder and MonthBodyComponentStyles.weekNumberStyle.dropTargetTile preview could fail to render while resizing an event.Fixed an issue where the highlighted selection border (dropTargetTile) was painted on the wrong tile or missing entirely in month view overlapping eve
dropTargetTile) was painted on the wrong tile or missing entirely in month view overlapping events and the "X more" overflow drop-down.TimeIndicator would disappear when zooming the calendar before any page navigation had occurred.Reverted ResizeHandle and ResizeHandles now take a length parameter.
ResizeHandle and ResizeHandles now take a length parameter.resizeDragAnchorStrategy to TileComponents.ResizeHandle and ResizeHandles now take a length parameter to provide properly sized Draggable feedback widgets instead of an empty layout, improving
ResizeHandle and ResizeHandles now take a length parameter to provide properly sized Draggable feedback widgets instead of an empty layout, improving the resizing feedback.TapDetail from *WithDetail callbacks now calculates the exact DateTime under the cursor or finger tap based on spatio-temporal position within the eve
TapDetail from *WithDetail callbacks now calculates the exact DateTime under the cursor or finger tap based on spatio-temporal position within the event UI, rather than returning the event's start time.Added support for secondary gestures (right-clicks) on empty calendar spaces: onSecondaryTapped, onSecondaryLongPressed and their WithDetail variants.
onSecondaryTapped, onSecondaryLongPressed and their WithDetail variants.onEventSecondaryTapped and onEventSecondaryTappedWithDetail.DayDetail and MultiDayDetail exposed internal InternalDateTime and InternalDateTimeRange objects without timezone offsets applied. All tap details now correctly apply .forLocation() to expose wall-clock DateTimes to consumers.onLongPressed, onSecondaryLongPressed) leaking internal representations instead of .forLocation() adjusted ones.New NowCallback typedef and ViewConfiguration.nowCallback field to decouple the time indicator, today highlighting, and schedule empty-day logic from
NowCallback typedef and ViewConfiguration.nowCallback field to decouple the time indicator, today highlighting, and schedule empty-day logic from the calendar's configured Location.InternalDateTime.isToday() now accepts an optional DateTime? now parameter, allowing callers to override what "today" means.DayHeader, MonthDayHeader, and ScheduleDate read nowCallback from the view configuration and use it for today highlighting. When set, it takes priority over the Location-based check.EmptyDayBehavior.showToday in ScheduleBody now respects nowCallback.todayKey constants on DayHeader, MonthDayHeader, and ScheduleDate for easier widget-test assertions.InternalDateTime.isToday(now:) parameter.nowCallback-driven today highlighting across DayHeader, MonthDayHeader, and ScheduleDate.nowCallback.ResizeHandlePositioner typedef now takes an additional bool isImprecise parameter.
ResizeHandlePositioner typedef now takes an additional bool isImprecise parameter.ResizeHandles abstract class now requires an isImprecise constructor parameter.InputMode enum (auto, precise, imprecise) on CalendarInteraction replaces platform-based mobile/desktop detection for resize handle behavior.iOS/Android).InputMode.auto (default) detects input type dynamically. Hover triggers precise mode, selection triggers imprecise mode.allowHorizontalImpreciseResize option on CalendarInteraction to opt-in to horizontal resize handles for touch input (disabled by default).CalendarInteraction.resolveIsImprecise() provides a way to query the resolved input mode.isMobileDevice usage from resize handle widgets.CalendarEvent is no longer generic. The data field and type parameter have been removed. Custom data should now be added by extending CalendarEvent di
CalendarEvent is no longer generic. The data field and <T> type parameter have been removed. Custom data should now be added by extending CalendarEvent directly.int to String. This affects addEvent (returns String), addEvents (returns List<String>), removeById, byId, and any code that stores or compares event IDs.EventTile.eventId is now a String.MultiDayOverlayEventTile renamed to MultiDayEventOverlayTile.EventsController folder moved into the controllers folder. Update any direct imports.CalendarEvent is now extensible. Attach custom fields (title, color, etc.) by sub-classing and overriding copyWith. See the updated examples for guidance.CalendarEvent gained a layoutEquals method used internally for optimized layout rebuilds.fix: SnapPoints calculation.fix: Visible events not updating correctly after a change.fix: Pointer events now pass through the time indicator widget.EventLayoutDelegateCache is now cleared automatically when heightPerMinute changes.eventsFromDateTimeRange: the location parameter is no longer required.DefaultEventsController is now exported from kalender.dart directly.tool/test_timezones_linux.dart) for running the test suite under multiple timezones on Linux.CalendarEvent extensibility, EventsController as a full interface, and event/group ID migration to String contributed by RedDuality.Nothing published for this version
feat: Use linked_pageview package for linked scrolling between multi-day header and body. PR #247
linked_pageview package for linked scrolling between multi-day header and body. PR #247EventLayoutDelegateCache not being cleared when heightPerMinute changes.MultiDayViewController now correctly exposes a page offset listener.kalender/extensions.dart.asUtc and asLocal extensions to InternalDateTime.EventLayoutStrategy now takes a InternalDateTime instead of a DateTime.GenerateMultiDayLayoutFrame now takes a InternalDateTimeRange instead of a DateTime.CalendarEvent stores start and end times in utc format.CalendarController this is now set in the ViewConfiguration of the CalendarWidget. ****visibleDateTimeRangeUtc valueNotifier in the CalendarController with a nullable internalDateTimeRange. (visibleDateTimeRange is remains the same).EventsController.eventsFromDateTimeRange now uses InternalDateTimeRange and takes a nullable Location from the timezone package.DefaultDateMap to accommodate different timezones, any custom implementations will need to be updated.EventTileUtils mixin was also updated to use the new internal date time classes.PageNavigationFunctions was renamed to PageIndexCalculator and updated to use internal date time classes.selectedDate to initialDateTime.CalendarHeader and CalendarBody no longer take ValueNotifiers and will instead create and dispose ValueNotifiers created from values passed to them.feat: Made TextAlign and TextOverflow configurable for TimelineStyle. PR #242 Thanks to quaaantumdev
fix: Tile and ResizeHandleWidget rebuild issues.
Nothing published for this version
feat: Custom onWillAcceptWithDetails functions for DragTargets. #213
fix: MultiDayLayoutFrameCache using toString() to generate map key. #225
toString() to generate map key. #225Deprecated onMultiDayTapped. (Use onTappedWithDetail instead).
onTappedWithDetail, onLongPressed and onLongPressedWithDetail callbacks.
- Deprecated onMultiDayTapped. (Use onTappedWithDetail instead).
- Not providing onEventTapped and onEventTappedWithDetail will remove internal gesture detectors for events, removing interference for GestureDetectors added to EventTileBuilders.
- Added mixins (DayEventTileUtils and MultiDayEventTileUtils) for EventTileBuilders that have their own gesture detectors.
- Added onEventCreateWithDetail as used in the new advanced example.calculateLocalCursorPosition, add scroll offset after converting to local coordinate space.feat: Added eventComparator to defaultMultiDayFrameGenerator thanks to captaingerhard. PR #210
eventComparator to defaultMultiDayFrameGenerator thanks to captaingerhard. PR #210Your coding agent can read these notes before it upgrades. Set up the MCP server →