flutter_calendar_widget
flutter_calendar_widget 是一个高度可定制的日历小部件。
您不仅可以更改样式,还可以更改日历中的小部件,因此您可以根据需要进行自定义。
功能
- 支持多种日期选择,如单选、范围选择、多选等
- 可在日历中注册事件
- 高级可定制;日历中的所有小部件都可以更改。
- 支持多语言翻译。
- 日历大小会根据内容动态变化。
- 可以添加日历导航头。
- 可以更改导航头中的图标。
- 可以更改日历样式。
- 日历中的所有文本都可以更改。
安装
flutter pub add flutter_calendar_widget
用法
选择模式
根据选择模式,您可以指定以下三种选择方法。
1. CalendarSelectionMode.single 用于选择单个日期。
允许选择单个日期,选择新日期将取消先前日期的选择,并将选择更新为新选择的日期。
预览
示例
FlutterCalendar(
selectionMode: CalendarSelectionMode.single,
onDayPressed: (DateTime date) {
print(date);
}
)
2. CalendarSelectionMode.multiple 用于选择多个日期。
允许多日期选择,选择新日期不会取消先前日期的选择,允许尽可能多地选择日期。
预览
示例
FlutterCalendar(
selectionMode: CalendarSelectionMode.multiple,
onMultipleDates: (List<DateTime> dates) {
for (var date in dates) {
print(date);
}
},
)
3. CalendarSelectionMode.range 允许选择一个日期范围。
预览
示例
FlutterCalendar(
selectionMode: CalendarSelectionMode.range,
onRageDate: (CalendarDateRange dateRange) {
print(
'start: ${dateRange.start}, end: ${dateRange.end}',
);
},
)
如何更改样式
有两种主要方法可以为日历小部件设置样式。
1. 更改文本样式。
您可以通过注入 CalendarTextStyle 实例来更改文本样式。
示例
FlutterCalendar(
selectionMode: CalendarSelectionMode.single,
textStyle: const CalendarTextStyle(
dayFontSize: 16,
dayTextColor: Colors.blue,
),
)
2. 更改文本以外的样式。
文本样式以外的样式可以通过注入 CalendarStyle 实例来更改。
示例
FlutterCalendar(
selectionMode: CalendarSelectionMode.single,
style: const CalendarStyle(
markerColor: Colors.green,
),
)
如何更改小部件
日历中的所有小部件都可以更改。所有小部件都是通过继承 CalendarBuilder 抽象类来构建的,您可以通过方法重写来对所需的小部件进行更改。
预览
示例
import 'package:flutter/material.dart';
import 'package:flutter_calendar_widget/flutter_calendar_widget.dart';
class CustomCalenderBuilder extends CalendarBuilder {
@override
Widget buildRangeDay(DateTime dateTime) {
return Container();
}
@override
Widget buildRangeDayLine(BoxConstraints constraints) {
return SizedBox(
child: Container(
alignment: Alignment.center,
color: Colors.greenAccent,
child: const Text(
'?',
style: TextStyle(
color: Colors.black,
),
),
),
);
}
@override
Widget buildRangeStartLine(BoxConstraints constraints) {
return Align(
alignment: Alignment.centerRight,
child: Container(
width: constraints.maxWidth / 2,
decoration: BoxDecoration(
border: Border.all(width: 0, color: Colors.greenAccent),
color: Colors.greenAccent,
),
),
);
}
@override
Widget buildRangeEndLine(BoxConstraints constraints) {
return Align(
alignment: Alignment.centerLeft,
child: Container(
width: constraints.maxWidth / 2,
decoration: BoxDecoration(
border: Border.all(width: 0, color: Colors.greenAccent),
color: Colors.greenAccent,
),
),
);
}
}
class CustomDemoScreen extends StatelessWidget {
const CustomDemoScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Custom demo screen'),
),
body: SafeArea(
child: FlutterCalendar(
selectionMode: CalendarSelectionMode.range,
calendarBuilder: CustomCalenderBuilder(),
),
),
);
}
}
如何注册事件
您可以创建事件并将其注册到日历中。
预览
用法
创建一个 EventList 来注册事件。如果您在 General 中指定类型,您可以在 onDayPressed 回调中区分类型。
示例
EventList<Event> events = EventList(
events: {
DateTime(2022, 6, 7): [
const Event('Event 1),
const Event('Event 2),
]
}
);
...
FlutterCalendar(
selectionMode: CalendarSelectionMode.single,
focusedDate: DateTime.now(),
events: events,
onDayPressed: (DateTime day) {
Event event = events.get(day);
print(event);
},
),
另请参阅: event_demo_screen
如何设置本地化
该项目正在使用 intl 包进行本地化。
默认值为设备上设置的语言值。您可以在 此处 查看 locale 可以输入的值。
示例
FlutterCalendar(
locale: 'en',
)
贡献者 ✨
在提交拉取请求之前,请务必阅读 贡献指南。感谢所有为维护和升级此项目做出贡献的人!
感谢这些出色的人(表情符号键)





