Flutter日历插件emor_ckcalendar的使用

Flutter日历插件emor_ckcalendar的使用

特性

  • 广泛且易于使用的API
  • 预配置的UI与可自定义的样式
  • 自定义选择生成器以实现无限的UI设计
  • 本地化支持
  • 范围选择支持
  • 多重选择支持
  • 动态事件和假期
  • 垂直自动调整大小 - 适应内容或填充视口
  • 多种日历格式(月、两周、周)
  • 水平滑动边界(第一天、最后一天)

使用说明

确保查看示例以获取更多详细信息。

安装

pubspec.yaml文件中添加以下依赖:

dependencies:
  emor_ckcalendar: ^0.0.3

基本设置

完整的示例可在这里找到。

EmorCalendar需要你提供firstDaylastDayfocusedDay

  • 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',
),
1 回复

更多关于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. 处理国际化

如果你的应用需要支持多语言,你可以通过配置 MaterialApplocalizationsDelegatessupportedLocales 来支持不同的语言环境。

MaterialApp(
  localizationsDelegates: [
    GlobalMaterialLocalizations.delegate,
    GlobalWidgetsLocalizations.delegate,
  ],
  supportedLocales: [
    const Locale('en', 'US'), // English
    const Locale('zh', 'CN'), // Chinese
    // 其他语言
  ],
  // 其他配置
)
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!