calendarview_flutter 0.1.0 copy "calendarview_flutter: ^0.1.0" to clipboard
calendarview_flutter: ^0.1.0 copied to clipboard

A customizable Flutter calendar view with single selection, range selection, multi-selection, year view, and pluggable calendar cell builders.

CalendarView Flutter API #

中文 | English

本文档只描述发布到 pub 的日历 SDK API。示例页面和具体业务样式仅保留在仓库 demo 中,不属于发布包内容。

支持作者 #

如果这个库对你有帮助,可以请作者喝杯咖啡。

支付宝 微信

界面截图 #

导入 #

import 'package:calendarview_flutter/calendarview_flutter.dart';

最小使用 #

final controller = CalendarController(focusedDay: DateTime.now());

CalendarView(
  controller: controller,
  pageOrientation: CalendarPageOrientation.horizontal,
  onDaySelected: (day) {
    controller.selectDay(day);
  },
)

CalendarController #

构造参数:

参数 类型 说明
focusedDay DateTime? 当前聚焦日期,默认今天
minDate DateTime? 可显示/可选择的最小日期
maxDate DateTime? 可显示/可选择的最大日期
minSelectRange int 范围选择最小天数,-1 表示不限制
maxSelectRange int 范围选择最大天数,-1 表示不限制
maxMultiSelectSize int 多选最大数量,-1 表示不限制
markers Map<DateTime, List<CalendarMarker>> 日期标记数据
disabledDates Set<DateTime> 固定禁用日期
disabledDatePredicate CalendarDatePredicate? 动态禁用日期判断

状态读取:

API 说明
focusedDay 当前聚焦日期
displayMode 当前月/周模式
selectionMode 当前单选/范围/多选模式
firstWeekday 周起始日
selection 完整选择状态
rangeSelection 范围选择起止值
selectedRangeDates 已完成范围内所有日期
selectedMultiDates 多选日期列表,已排序
markers 当前标记数据
monthViewShowMode 月视图显示模式
onlyCurrentMonth 是否只显示当前月日期
interceptBlocked 是否启用内置演示禁用日期
minSelectRange / maxSelectRange 范围选择天数限制
maxMultiSelectSize 多选数量限制
minDate / maxDate 日期边界
calendarRange CalendarBounds(min, max)
rangeDescription 日期边界描述文本

配置方法:

API 说明
setCalendarRange({minDate, maxDate, clampFocusedDay, adjustSelection}) 设置日期边界
setRange(minYear, minMonth, minDay, maxYear, maxMonth, maxDay) 原 Android 风格的日期边界设置
setRangeSelectionLimits({minRange, maxRange}) 设置范围选择天数限制
setMaxMultiSelectSize(maxSize) 设置多选数量上限
setDisplayMode(mode) 设置月/周模式
toggleDisplayMode() 切换月/周模式
setWeekStart(weekday) 设置周起始日,如 DateTime.sunday
setOnlyCurrentMonth(value) 设置是否只显示当前月
setMonthViewShowMode(mode) 设置月视图显示模式
setInterceptBlocked(value) 开关内置演示禁用日期
setDisabledDatePredicate(predicate) 设置动态禁用规则
setSelectionMode(mode) 设置选择模式
setMarkers(markers) 替换日期标记

跳转与选择:

API 说明
jumpToDay(day) 跳到指定日期
jumpToMonth(month) 跳到指定月份
nextPage() 下一页
previousPage() 上一页
selectDay(day) 选择日期,返回是否成功
clearSelection() 清空当前模式下的选择
isDisabled(day) 日期是否不可选
isSelected(day) 日期是否选中
isRangeStart(day) 是否范围开始日期
isRangeEnd(day) 是否范围结束日期
isMultiSelectOutOfSize(day) 多选是否超出数量
rangeSelectionLimitViolation(day) 范围选择是否违反天数限制
canSelectRangeEnd(day) 是否可作为范围结束日期
canNavigateToPreviousPage() 是否能向前翻页
canNavigateToNextPage() 是否能向后翻页
resolvedPageAnchorForRelative(relative) 获取相对页锚点日期
canShowMonth(month) 月份是否在可显示范围内
canShowWeek(anchorDay) 周是否在可显示范围内

选择模式 #

单选:

controller
  ..setSelectionMode(CalendarSelectionMode.single)
  ..selectDay(DateTime(2026, 7, 14));

范围选择:

controller
  ..setSelectionMode(CalendarSelectionMode.range)
  ..setRangeSelectionLimits(minRange: 2, maxRange: 14);

CalendarView(
  controller: controller,
  pageOrientation: CalendarPageOrientation.horizontal,
  onDaySelected: (day) => controller.selectDay(day),
  onRangeSelected: (range) {
    final start = range.start;
    final end = range.end;
  },
  onSelectOutOfRange: (day, violation) {},
)

多选:

controller
  ..setSelectionMode(CalendarSelectionMode.multi)
  ..setMaxMultiSelectSize(5);

CalendarView(
  controller: controller,
  pageOrientation: CalendarPageOrientation.horizontal,
  onDaySelected: (day) => controller.selectDay(day),
  onMultiSelected: (day, selectedSize, maxSize) {},
  onMultiSelectOutOfSize: (day, maxSize) {},
)

CalendarView #

核心月/周日历视图。

参数 类型 说明
controller CalendarController 日历状态控制器
onDaySelected ValueChanged<DateTime> 日期点击回调
pageOrientation CalendarPageOrientation 横向或纵向分页
componentBuilder CalendarComponentBuilder? 自定义日历 UI
onPageChanged ValueChanged<DateTime>? 页面变化回调
onDisplayedHeightChanged ValueChanged<double>? 显示高度变化回调
collapsePreviewProgress double? 折叠预览进度
previewExpandFromWeek bool 周视图拖拽展开预览
monthBodyHeightOverride double? 月主体高度覆盖
calendarHeight double 单行高度
weekBarHeight double 星期栏高度
monthHeaderHeight double 月份头高度
handleDaySelection bool 由视图内部调用 selectDay
onRangeSelected CalendarRangeSelectedCallback? 范围选择成功回调
onSelectOutOfRange CalendarRangeLimitViolationCallback? 范围选择限制回调
onMultiSelected CalendarMultiSelectedCallback? 多选成功回调
onMultiSelectOutOfSize CalendarMultiSelectOutOfSizeCallback? 多选超限回调

CalendarInteractiveController #

控制可展开、折叠、全屏的日历布局。

状态:

API 说明
pageOrientation 当前分页方向
displayMode 当前月/周模式
collapseProgress 折叠进度
isFullScreenExpanded 是否全屏展开
isCollapsed / isExpanded 是否折叠/展开

方法:

API 说明
setPageOrientation(orientation) 设置分页方向
togglePageOrientation() 切换分页方向
expand() 展开日历
collapse() / shrink() 收起日历
toggleFullScreen() 切换全屏

CalendarInteractiveView #

日历 + 内容列表联动视图。

参数 说明
controller 日历控制器
onDaySelected 日期点击回调
contentBuilder 内容区构建器,接收 ScrollControllerScrollPhysics
onFocusedDayChanged 聚焦日期变化
interactionController 交互控制器
pageOrientation 分页方向覆盖
yearMode 年视图模式下禁用部分交互
calendarHeight / weekBarHeight / monthHeaderHeight 尺寸设置
componentBuilder 自定义日历 UI
contentVerticalDragLocked 锁定内容区分发给日历的纵向拖拽

CalendarMonthYearController #

控制年视图浮层。

API 说明
isYearMode 是否在年视图
visibleYear 当前年视图年份
showYearMode() 显示年视图
hideYearMode() 隐藏年视图
setYearMode(value) 设置年视图状态
toggleYearMode() 切换年视图状态

CalendarMonthYearView #

CalendarInteractiveView 之上增加年视图。

参数 说明
controller 日历控制器
onDaySelected 日期点击回调
contentBuilder 内容区构建器
onFocusedDayChanged 聚焦日期变化
onYearModeChanged 年视图状态变化
onMonthSelected 年视图中选择月份
interactionController 交互控制器
monthYearController 年视图控制器
pageOrientation 分页方向
calendarHeight / weekBarHeight / monthHeaderHeight 尺寸设置
componentBuilder 自定义日历 UI

CalendarMonthListView #

按月份连续滚动的列表视图。

参数 说明
controller 日历控制器
onDaySelected 日期点击回调
calendarHeight 单行高度
weekBarHeight 星期栏高度
componentBuilder 自定义日历 UI
onFocusedMonthChanged 聚焦月份变化

CalendarYearModeStyle #

年视图样式配置。

字段 说明
backgroundColor 背景色
primaryColor 主文本色
dayColor 月份预览日期颜色
outsideMonthDayColor 月份外日期颜色
selectedColor 选中背景色
selectedTextColor 选中文本色
dividerColor 分割线颜色
inactiveBorderColor 非激活边框色
disabledMonthBackgroundColor 禁用月份背景色
disabledMonthBorderColor 禁用月份边框色
disabledMonthTextColor 禁用月份标题色
disabledMonthDayColor 禁用月份日期色
disabledMonthOutsideDayColor 禁用月份外日期色
headerHeight 年视图头部高度
monthCardRadius 月份卡片圆角
monthNames 月份名称

内置值:CalendarYearModeStyle.darkCalendarYearModeStyle.vertical

CalendarYearModeLayout #

为自定义页面增加年视图覆盖层。

参数 说明
controller CalendarMonthYearController
selectedDate 当前选中日期
minDate / maxDate 可选月份范围
style 年视图样式
onMonthSelected 月份选择回调
child 页面内容

CalendarComponentBuilder #

日历样式扩展协议。库层只提供协议,不内置 demo 样式。

需要实现:

API 说明
orderedWeekLabels(firstWeekday) 按周起始返回星期文本
buildWeekBarCell(context, data) 构建星期栏单元
buildDayCell(context, data) 构建日期单元

可覆盖:

API 说明
contentPadding 日历主体左右内边距
weekBarBackgroundColor 星期栏背景色
buildMonthHeader(context, month, height) 月份头
buildWeekBar(context, data) 完整星期栏

示例:

class MyCalendarBuilder extends CalendarComponentBuilder {
  const MyCalendarBuilder();

  @override
  List<String> orderedWeekLabels(int firstWeekday) {
    return calendarOrderedWeekLabels(
      const ['日', '一', '二', '三', '四', '五', '六'],
      firstWeekday,
    );
  }

  @override
  Widget buildWeekBarCell(BuildContext context, CalendarWeekBarCellData data) {
    return Text(data.label);
  }

  @override
  Widget buildDayCell(BuildContext context, CalendarDayCellData data) {
    return Center(child: Text('${data.date.day}'));
  }
}

辅助 API:

API 说明
DefaultCalendarComponentBuilder 默认基础样式
calendarOrderedWeekLabels(labels, firstWeekday) 根据周起始重排星期文本
kCalendarHorizontalPadding 默认水平边距

数据模型与回调 #

API 说明
CalendarSelectionMode.single/range/multi 选择模式
CalendarDisplayMode.month/week 显示模式
CalendarPageOrientation.horizontal/vertical 分页方向
MonthViewShowMode.allMonth/onlyCurrentMonth/fitMonth 月视图显示模式
CalendarRangeLimitViolation.belowMinRange/aboveMaxRange 范围选择限制类型
CalendarBounds(min, max) 日期边界
CalendarMarker(label, color) 日期标记
LunarMetadata(lunarText, solarTerm) 农历/节气文本
DateRangeValue(start, end) 范围选择值
CalendarSelectionState(single, range, multi) 完整选择状态
CalendarDatePredicate 日期判断函数
CalendarRangeSelectedCallback 范围选择回调
CalendarRangeLimitViolationCallback 范围选择限制回调
CalendarMultiSelectedCallback 多选回调
CalendarMultiSelectOutOfSizeCallback 多选超限回调

年概览弹层 #

await showYearOverviewSheet(
  context,
  year: 2026,
  onMonthSelected: (month) {
    controller.jumpToMonth(month);
  },
);

致谢 #

感谢 huanghaibin-dev/CalendarView 作者提供 Android 版本源码参考。

再次感谢支持 #

如果这个库节省了你的开发时间,欢迎支持作者持续维护。

支付宝 微信
5
likes
150
points
27
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

A customizable Flutter calendar view with single selection, range selection, multi-selection, year view, and pluggable calendar cell builders.

Repository (GitHub)
View/report issues

Topics

#calendar #flutter #date-picker #calendar-view

License

MIT (license)

Dependencies

flutter, lunar

More

Packages that depend on calendarview_flutter