Flutter日历插件emor_ckcalendar的使用
Flutter日历插件emor_ckcalendar的使用
特性
- 广泛且易于使用的API
- 预配置的UI与可自定义的样式
- 自定义选择生成器以实现无限的UI设计
- 本地化支持
- 范围选择支持
- 多重选择支持
- 动态事件和假期
- 垂直自动调整大小 - 适应内容或填充视口
- 多种日历格式(月、两周、周)
- 水平滑动边界(第一天、最后一天)
使用说明
确保查看示例以获取更多详细信息。
安装
在pubspec.yaml
文件中添加以下依赖:
dependencies:
emor_ckcalendar: ^0.0.3
基本设置
完整的示例可在这里找到。
EmorCalendar
需要你提供firstDay
、lastDay
和focusedDay
:
firstDay
是日历的第一个可用日期。用户无法访问该日期之前的日期。lastDay
是日历的最后一个可用日期。用户无法访问该日期之后的日期。focusedDay
是当前关注的日期。使用此属性来确定当前应显示哪个月份。
EmorCalendar(
firstDay: DateTime.utc(2010, 10, 16),
lastDay: DateTime.utc(2030, 3, 14),
focusedDay: DateTime.now(),
);
添加交互性
你可能会注意到之前设置的日历小部件并不是完全互动的 - 你只能通过左右滑动来更改当前可见的月份。虽然这在某些情况下可能已经足够,但你可以通过指定几个回调使其更加生动。
添加以下代码到日历小部件中,将允许其响应用户的点击操作,并标记被点击的日期为已选中:
selectedDayPredicate: (day) {
return isSameDay(_selectedDay, day);
},
onDaySelected: (selectedDay, focusedDay) {
setState(() {
_selectedDay = selectedDay;
_focusedDay = focusedDay; // 同时更新 `_focusedDay`
});
},
为了动态更新可见的日历格式,可以向小部件添加以下代码:
calendarFormat: _calendarFormat,
onFormatChanged: (format) {
setState(() {
_calendarFormat = format;
});
},
这两个更改将使日历更具交互性,并对用户的输入作出响应。
更新focusedDay
将focusedDay
设置为静态值意味着每当EmorCalendar
小部件重建时,它都会使用特定的focusedDay
。你可以通过热重载快速测试这一点:将focusedDay
设置为DateTime.now()
,然后滑动到下一个月并触发热重载 - 日历将恢复到初始状态。为了避免这种情况发生,你应该在任何回调暴露focusedDay
时存储和更新它。
添加以下回调以完成基本设置:
onPageChanged: (focusedDay) {
_focusedDay = focusedDay;
},
值得注意的是,在onPageChanged()
回调内部不需要调用setState()
。你应该只更新存储的值,这样如果小部件稍后重建,它会使用正确的focusedDay
。
事件
完整的示例可在这里找到。
你可以向EmorCalendar
小部件提供自定义事件。为此,使用eventLoader
属性 - 你会得到一个DateTime
对象,你需要为其分配一个事件列表。
eventLoader: (day) {
return _getEventsForDay(day);
},
_getEventsForDay()
可以是任意实现。例如,可以使用Map<DateTime, List<T>>
:
List<Event> _getEventsForDay(DateTime day) {
return events[day] ?? [];
}
需要注意的是,DateTime
对象包含日期和时间部分。在许多情况下,对于日历相关的方面,时间部分是多余的。
如果你决定使用Map
,建议使用LinkedHashMap
- 这将允许你覆盖两个DateTime
对象之间的相等比较,仅根据它们的日期部分进行比较:
final events = LinkedHashMap(
equals: isSameDay,
hashCode: getHashCode,
)..addAll(eventSource);
循环事件
eventLoader
允许你轻松添加重复的事件。例如,这将在每个星期一添加一个事件:
eventLoader: (day) {
if (day.weekday == DateTime.monday) {
return [Event('Cyclic event')];
}
return [];
},
点击日期选择事件
通常情况下,希望有一个子列表来表示通过点击日期选择的事件。你可以通过在onDaySelected
回调中使用与eventLoader
相同的实现方法来实现这一点:
void _onDaySelected(DateTime selectedDay, DateTime focusedDay) {
if (!isSameDay(_selectedDay, selectedDay)) {
setState(() {
_focusedDay = focusedDay;
_selectedDay = selectedDay;
_selectedEvents = _getEventsForDay(selectedDay);
});
}
}
使用CalendarBuilders自定义UI
要使用自己的小部件自定义UI,可以使用CalendarBuilders
。每个生成器可以用来有选择地覆盖UI,允许你实现高度特定的设计而无需太多麻烦。
你可以从任何生成器返回null
以使用默认样式。例如,以下代码片段只会覆盖周日的周几标签(Sun),其他周几标签保持不变:
calendarBuilders: CalendarBuilders(
dowBuilder: (context, day) {
if (day.weekday == DateTime.sunday) {
final text = DateFormat.E().format(day);
return Center(
child: Text(
text,
style: TextStyle(color: Colors.red),
),
);
}
},
),
本地化
要将日历显示为你想要的语言,可以使用locale
属性。如果不指定它,则会使用默认语言。
初始化
在你可以使用本地化之前,可能需要初始化日期格式化。
一种简单的方法如下:
- 首先,将
intl
包添加到你的pubspec.yaml
文件中。 - 然后修改你的
main()
函数:
import 'package:intl/date_symbol_data_local.dart';
void main() {
initializeDateFormatting().then((_) => runApp(MyApp()));
}
完成上述两个步骤后,你的应用应该准备好使用不同语言的EmorCalendar
。
指定语言
要指定语言,只需将其作为字符串代码传递给locale
属性。
例如,这将使EmorCalendar
使用波兰语:
EmorCalendar(
locale: 'pl_PL',
),
更多关于Flutter日历插件emor_ckcalendar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
emor_ckcalendar
是一个 Flutter 日历插件,用于在 Flutter 应用中显示和管理日历事件。以下是如何使用 emor_ckcalendar
插件的详细步骤:
1. 添加依赖
首先,在你的 pubspec.yaml
文件中添加 emor_ckcalendar
插件的依赖:
dependencies:
flutter:
sdk: flutter
emor_ckcalendar: ^1.0.0 # 请检查最新版本
然后运行 flutter pub get
来安装依赖。
2. 导入包
在你的 Dart 文件中导入 emor_ckcalendar
包:
import 'package:emor_ckcalendar/emor_ckcalendar.dart';
3. 使用日历组件
接下来,你可以在你的 Flutter 应用中使用 EmorCkCalendar
组件。以下是一个简单的示例:
class CalendarScreen extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Calendar'),
),
body: EmorCkCalendar(
// 配置日历的初始日期
initialDate: DateTime.now(),
// 配置日历的开始日期
firstDate: DateTime(2020, 1, 1),
// 配置日历的结束日期
lastDate: DateTime(2030, 12, 31),
// 处理日期选择事件
onDaySelected: (DateTime selectedDate, List<dynamic> events) {
print('Selected date: $selectedDate');
print('Events on this date: $events');
},
// 配置事件数据
events: {
DateTime(2023, 10, 1): ['Event 1', 'Event 2'],
DateTime(2023, 10, 5): ['Event 3'],
},
),
);
}
}
4. 运行应用
现在,你可以运行你的 Flutter 应用,并查看日历组件的效果。你可以在日历中选择日期,并查看与该日期关联的事件。
5. 自定义日历
你可以根据需要自定义日历的外观和行为。EmorCkCalendar
提供了多个参数来配置日历的样式、事件显示方式等。例如:
calendarStyle
: 用于自定义日历的样式。headerStyle
: 用于自定义日历头部的样式。eventDecoration
: 用于自定义事件的显示样式。
以下是一个自定义日历样式的示例:
EmorCkCalendar(
initialDate: DateTime.now(),
firstDate: DateTime(2020, 1, 1),
lastDate: DateTime(2030, 12, 31),
onDaySelected: (DateTime selectedDate, List<dynamic> events) {
print('Selected date: $selectedDate');
print('Events on this date: $events');
},
events: {
DateTime(2023, 10, 1): ['Event 1', 'Event 2'],
DateTime(2023, 10, 5): ['Event 3'],
},
calendarStyle: CalendarStyle(
selectedColor: Colors.blue,
todayColor: Colors.green,
eventColor: Colors.red,
),
headerStyle: HeaderStyle(
centerHeaderTitle: true,
formatButtonVisible: false,
),
eventDecoration: BoxDecoration(
color: Colors.yellow,
borderRadius: BorderRadius.circular(5),
),
)
6. 处理事件
你可以通过 onDaySelected
回调来处理用户选择的日期,并根据需要执行相应的操作。例如,你可以跳转到另一个页面显示该日期的详细信息,或者在页面上显示一个对话框。
7. 添加事件
你可以通过 events
参数来添加事件。events
是一个 Map<DateTime, List<dynamic>>
类型的数据结构,其中 DateTime
是日期,List<dynamic>
是该日期上的事件列表。
8. 其他功能
emor_ckcalendar
插件可能还提供了其他功能,例如支持多选日期、支持不同日历视图(月视图、周视图、日视图)等。你可以查阅插件的文档或源码来了解更多详细信息和用法。
9. 处理时区
如果你的应用需要处理时区问题,确保在 DateTime
对象中使用正确的时区信息。
10. 处理国际化
如果你的应用需要支持多语言,你可以通过配置 MaterialApp
的 localizationsDelegates
和 supportedLocales
来支持不同的语言环境。
MaterialApp(
localizationsDelegates: [
GlobalMaterialLocalizations.delegate,
GlobalWidgetsLocalizations.delegate,
],
supportedLocales: [
const Locale('en', 'US'), // English
const Locale('zh', 'CN'), // Chinese
// 其他语言
],
// 其他配置
)