Flutter日历插件as_calendar的使用

Flutter日历插件as_calendar的使用

简介

as_calendar 是一个高度可定制的 Flutter 日历组件,支持多种高级功能,如日期选择对话框和自定义月份视图。

特性:

  • 水平滚动的月份视图:日历以水平方式显示月份,并在日期上方绘制事件线。
  • 日期选择对话框:使用范围选择模式的日期选择对话框,可以完全自定义按钮、文本和日历的外观。
  • 可自定义的事件小部件:可以自定义每个日期上显示的事件样式。

截图

截图1 截图2 截图3

截图4 截图5 截图6

截图7


安装

pubspec.yaml 文件中添加 as_calendar 作为依赖项:

dependencies:
  as_calendar: latest_version

然后导入包:

import 'package:as_calendar/as_calendar.dart';

参数

以下是 AsCalendar 的参数说明:

类型 名称 描述 默认值
AsCalendarController controller 日历控制器 -
DateTime initialDate 日历创建时显示的初始日期 -
OnTapCallback onDayClicked 单击某天时的回调函数 -
WeekDays firstDayOfWeek 一周从哪一天开始 WeekDays.sunday
WeekDaysBuilder weekDaysBuilder 自定义一周中每天的构建器 -
DayItemBuilder dayItemBuilder 自定义日历格子的构建器 -
bool forceSixWeek 强制日历始终显示六行 false
Color backgroundColor 日历背景颜色 -
int maxEventLines 每天最多显示的事件数量 4
EventBuilder eventBuilder 自定义事件小部件的构建器 -
TouchMode touchMode 日历的触摸模式(如单击、范围选择) -
double eventsTopPadding 事件小部件的顶部填充 -
OnRangeSelectedCallback onRangeSelected 范围选择模式下的回调函数,接收选中的范围 -
int onSwipeCallbackDebounceMs 滑动回调的防抖时间(毫秒) -
DateTime minDate 允许的最早日期 -
DateTime maxDate 允许的最晚日期 -

基本用法

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  final AsCalendarController _controller = AsCalendarController();

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: AsCalendar(
          initialDate: DateTime.now(),
          controller: _controller,
        ),
      ),
    );
  }
}

注意:在包含 AsCalendar 组件的页面上避免频繁调用 setState 以保持性能。


日期选择对话框

AsCalendar 提供了日期选择对话框,允许用户选择事件的日期范围,并且可以选择各种自定义选项。

DatePickerProperties 参数

类型 名称 描述 默认值
Color backgroundColor 日期选择器和年份选择的背景色 Colors.white
DateTime initialPickerDate 对话框打开时显示的初始日期 -
EdgeInsets padding 日期选择器对话框的填充 EdgeInsets.all(8)
DayItemBuilder dayItemBuilder 单个日期项的构建器 -
TouchMode pickerMode 日期选择模式(如单击、范围选择) -
WeekDaysBuilder weekDaysBuilder 一周中每一天的构建器 -
DateTitleBuilder pickerTitleBuilder 日期选择器标题的构建器 -
Alignment pickerTitleAlignInLandscape 日期选择器标题在横屏模式下的对齐方式 Alignment.centerLeft
Widget backButton 控制栏中的后退按钮 -
Widget forwardButton 控制栏中的前进按钮 -
DateTitleBuilder controlBarTitleBuilder 控制栏标题,位于前后按钮之间 -
bool showControlBar 是否显示控制栏 true
YearPickerItemBuilder yearPickerItemBuilder 年份选择项的自定义构建器 -
PickerButtonBuilder okButtonBuilder 确认选择按钮的构建器 -
PickerButtonBuilder cancelButtonBuilder 取消按钮的构建器 -
bool forceSixWeek 在月视图中强制显示六周 false
WeekDays firstWeekDay 日期选择器日历的一周从哪一天开始 WeekDays.sunday
DateTime minDate 最早可选日期 -
DateTime maxDate 最晚可选日期 -
LandscapeDaysResizeMode landscapeDaysResizeMode 横屏下日历格子的调整模式(适应或可滚动) LandscapeDaysResizeMode.adaptive

示例用法

void _showDatePicker(BuildContext context) {
  showCrDatePicker(
    context,
    properties: DatePickerProperties(
      firstWeekDay: WeekDays.monday,
      okButtonBuilder: (onPress) =>
          ElevatedButton(child: const Text('确定'), onPressed: onPress),
      cancelButtonBuilder: (onPress) =>
          OutlinedButton(child: const Text('取消'), onPressed: onPress),
      initialPickerDate: DateTime.now(),
    ),
  );
}

更多关于Flutter日历插件as_calendar的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter日历插件as_calendar的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


as_calendar 是一个用于 Flutter 的日历插件,它提供了简单易用的界面来展示和管理日历事件。以下是使用 as_calendar 插件的基本步骤和示例代码。

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 as_calendar 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  as_calendar: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 来安装依赖。

2. 导入插件

在 Dart 文件中导入 as_calendar 插件:

import 'package:as_calendar/as_calendar.dart';

3. 使用 ASCalendar 组件

ASCalendaras_calendar 插件提供的主要组件,你可以通过配置 ASCalendar 来展示日历和事件。

import 'package:flutter/material.dart';
import 'package:as_calendar/as_calendar.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AS Calendar Example'),
        ),
        body: ASCalendar(
          initialDate: DateTime.now(),
          firstDate: DateTime(2020),
          lastDate: DateTime(2030),
          onDaySelected: (DateTime date) {
            print('Selected date: $date');
          },
        ),
      ),
    );
  }
}

4. 添加事件

你可以通过 ASCalendarEvent 类来添加事件,并将其传递给 ASCalendar 组件。

import 'package:flutter/material.dart';
import 'package:as_calendar/as_calendar.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AS Calendar Example'),
        ),
        body: ASCalendar(
          initialDate: DateTime.now(),
          firstDate: DateTime(2020),
          lastDate: DateTime(2030),
          onDaySelected: (DateTime date) {
            print('Selected date: $date');
          },
          events: [
            ASCalendarEvent(
              id: '1',
              title: 'Event 1',
              startDate: DateTime(2023, 10, 10, 10, 0),
              endDate: DateTime(2023, 10, 10, 12, 0),
            ),
            ASCalendarEvent(
              id: '2',
              title: 'Event 2',
              startDate: DateTime(2023, 10, 15, 14, 0),
              endDate: DateTime(2023, 10, 15, 16, 0),
            ),
          ],
        ),
      ),
    );
  }
}

5. 自定义日历样式

ASCalendar 提供了多种自定义选项,你可以通过设置 ASCalendar 的属性来调整日历的外观和行为。

ASCalendar(
  initialDate: DateTime.now(),
  firstDate: DateTime(2020),
  lastDate: DateTime(2030),
  onDaySelected: (DateTime date) {
    print('Selected date: $date');
  },
  events: [
    ASCalendarEvent(
      id: '1',
      title: 'Event 1',
      startDate: DateTime(2023, 10, 10, 10, 0),
      endDate: DateTime(2023, 10, 10, 12, 0),
    ),
  ],
  calendarStyle: CalendarStyle(
    selectedColor: Colors.blue,
    todayColor: Colors.green,
    eventColor: Colors.red,
    weekendTextStyle: TextStyle(color: Colors.purple),
  ),
  headerStyle: HeaderStyle(
    centerHeaderTitle: true,
    formatButtonVisible: false,
  ),
)

6. 处理事件点击

你可以通过 onEventTap 回调来处理事件点击。

ASCalendar(
  initialDate: DateTime.now(),
  firstDate: DateTime(2020),
  lastDate: DateTime(2030),
  onDaySelected: (DateTime date) {
    print('Selected date: $date');
  },
  events: [
    ASCalendarEvent(
      id: '1',
      title: 'Event 1',
      startDate: DateTime(2023, 10, 10, 10, 0),
      endDate: DateTime(2023, 10, 10, 12, 0),
    ),
  ],
  onEventTap: (ASCalendarEvent event) {
    print('Event tapped: ${event.title}');
  },
)

7. 完整示例

以下是一个完整的示例,展示了如何使用 as_calendar 插件来创建一个简单的日历应用。

import 'package:flutter/material.dart';
import 'package:as_calendar/as_calendar.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('AS Calendar Example'),
        ),
        body: ASCalendar(
          initialDate: DateTime.now(),
          firstDate: DateTime(2020),
          lastDate: DateTime(2030),
          onDaySelected: (DateTime date) {
            print('Selected date: $date');
          },
          events: [
            ASCalendarEvent(
              id: '1',
              title: 'Event 1',
              startDate: DateTime(2023, 10, 10, 10, 0),
              endDate: DateTime(2023, 10, 10, 12, 0),
            ),
            ASCalendarEvent(
              id: '2',
              title: 'Event 2',
              startDate: DateTime(2023, 10, 15, 14, 0),
              endDate: DateTime(2023, 10, 15, 16, 0),
            ),
          ],
          onEventTap: (ASCalendarEvent event) {
            print('Event tapped: ${event.title}');
          },
          calendarStyle: CalendarStyle(
            selectedColor: Colors.blue,
            todayColor: Colors.green,
            eventColor: Colors.red,
            weekendTextStyle: TextStyle(color: Colors.purple),
          ),
          headerStyle: HeaderStyle(
            centerHeaderTitle: true,
            formatButtonVisible: false,
          ),
        ),
      ),
    );
  }
}
回到顶部