Flutter日历功能插件flutter_plugin_calendar的使用

Flutter日历功能插件flutter_plugin_calendar的使用

flutter_plugin_calendar 是一个自定义的日历组件,可以显示月视图和周视图,并且支持视图之间的切换。它还支持自定义图标和颜色等功能。

获取开始

在项目的 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter_gt_plugin: 0.0.3

然后运行 flutter packages get 命令以安装依赖。

使用

首先,在你的 Dart 文件中导入 flutter_plugin_calendar 包:

import 'package:flutter_plugin_calendar/flutter_plugin_calendar.dart';

展示日历组件

showModalBottomSheet 展开

你可以通过 showModalBottomSheet 方法来展示日历组件:

Map<String, dynamic> dateMap = {
  '2021-07-14': '课',
  '2021-07-16': '课',
  '2021-07-02': '休',
  '2021-07-01': '休',
  '2021-07-31': '课',
  '2021-09-30': '课',
  '2021-09-29': '课',
  '2021-08-18': '课',
  '2021-10-28': '休',
  '2021-10-15': '休',
  '2021-10-11': '课',
};

FlutterPluginCalendar.showCalendarView(
  context,
  dateMap: dateMap,
  align: ControlAlign.top,
  format: DateFormat.chinese,
  previousTitle: '',
  nextTitle: '',
  iconColor: Colors.grey,
  onSelectedDateTime: (monthChanged, dateTime) {
    if(monthChanged){
      // 切换月份时刷新每个月的展示数据
      dateMap = {
        '2021-05-14': '课',
        '2021-07-16': '课',
        '2021-07-02': '休',
        '2021-07-01': '休',
        '2021-07-31': '课',
        '2021-08-18': '课',
        '2021-09-30': '课',
        '2021-09-29': '课',
        '2021-10-28': '休',
        '2021-10-15': '休',
        '2021-10-11': '课',
      };
    }
  },
);
添加到 widget 树

你也可以直接将 CalendarView 组件添加到你的 widget 树中:

/// 仅显示周
CalendarView(
  dateMap: dateMap,
  defaultMode: CalendarMode.week,
  showExpandMore: false,
  startDateTime: DateTime(DateTime.now().year - 2, 1, 1),
  endDateTime: DateTime(DateTime.now().year + 2, 1, 1),
  onSelectedDateTime: (monthChanged, dateTime) {
    debugPrint(dateTime.toString());
    if (monthChanged) {
      dateMap = {
        '2021-07-14': '课',
        '2021-07-16': '课',
        '2021-07-02': '休',
        '2021-07-01': '休',
        '2021-07-31': '课',
        '2021-09-30': '课',
        '2021-09-29': '课',
        '2021-08-18': '课',
        '2021-10-28': '休',
        '2021-10-15': '休',
        '2021-10-11': '课',
      };
      setState(() {});
    }
  },
),

/// 仅显示月
CalendarView(
  dateMap: dateMap,
  showExpandMore: true,
  startDateTime: DateTime(DateTime.now().year - 2, 1, 1),
  endDateTime: DateTime(DateTime.now().year + 2, 1, 1),
  onSelectedDateTime: (monthChanged, dateTime) {
    debugPrint(dateTime.toString());
    if (monthChanged) {
      dateMap = {
        '2021-07-14': '课',
        '2021-07-16': '课',
        '2021-07-02': '休',
        '2021-07-01': '休',
        '2021-07-31': '课',
        '2021-09-30': '课',
        '2021-09-29': '课',
        '2021-08-18': '课',
        '2021-10-28': '休',
        '2021-10-15': '休',
        '2021-10-11': '课',
      };
      setState(() {});
    }
  },
),

预览

image

完整示例代码

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

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

class MyApp extends StatefulWidget {
  [@override](/user/override)
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  void initState() {
    super.initState();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(home: ExampleApp());
  }
}

class ExampleApp extends StatefulWidget {
  [@override](/user/override)
  _ExampleAppState createState() => _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  Map<String, dynamic> dateMap = {
    '2021-07-14': '课',
    '2021-07-16': '课',
    '2021-07-02': '休',
    '2021-07-01': '休',
    '2021-07-31': '课',
    '2021-09-30': '课',
    '2021-09-29': '课',
    '2021-08-18': '课',
    '2021-10-28': '休',
    '2021-10-15': '休',
    '2021-10-11': '课',
  };

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Plugin example app'),
        actions: [
          IconButton(
            icon: Icon(Icons.calendar_view_day),
            onPressed: () {
              FlutterPluginCalendar.showCalendarView(
                context,
                dateMap: dateMap,
                align: ControlAlign.top,
                format: DateFormat.chinese,
                previousTitle: '',
                nextTitle: '',
                iconColor: Colors.grey,
                onSelectedDateTime: (monthChanged, dateTime) {
                  if (monthChanged) {
                    // 切换月份时刷新每个月的展示数据
                    dateMap = {
                      '2021-05-14': '课',
                      '2021-07-16': '课',
                      '2021-07-02': '休',
                      '2021-07-01': '休',
                      '2021-07-31': '课',
                      '2021-08-18': '课',
                      '2021-09-30': '课',
                      '2021-09-29': '课',
                      '2021-10-28': '休',
                      '2021-10-15': '休',
                      '2021-10-11': '课',
                    };
                  }
                },
              );
            },
          ),
        ],
      ),
      body: Container(
        color: Colors.white,
        child: Column(mainAxisAlignment: MainAxisAlignment.start, children: [
          Text('周---月---切换'),
          CalendarView(
            dateMap: dateMap,
            showExpandMore: true,
            startDateTime: DateTime(DateTime.now().year - 2, 1, 1),
            endDateTime: DateTime(DateTime.now().year + 2, 1, 1),
            onSelectedDateTime: (monthChanged, dateTime) {
              debugPrint(dateTime.toString());
              if (monthChanged) {
                dateMap = {
                  '2021-07-14': '课',
                  '2021-07-16': '课',
                  '2021-07-02': '休',
                  '2021-07-01': '休',
                  '2021-07-31': '课',
                  '2021-09-30': '课',
                  '2021-09-29': '课',
                  '2021-08-18': '课',
                  '2021-10-28': '休',
                  '2021-10-15': '休',
                  '2021-10-11': '课',
                };
                setState(() {});
              }
            },
          ),
          Text('仅显示周'),
          CalendarView(
            dateMap: dateMap,
            defaultMode: CalendarMode.week,
            showExpandMore: false,
            startDateTime: DateTime(DateTime.now().year - 2, 1, 1),
            endDateTime: DateTime(DateTime.now().year + 2, 1, 1),
            onSelectedDateTime: (monthChanged, dateTime) {
              debugPrint(dateTime.toString());
              if (monthChanged) {
                dateMap = {
                  '2021-07-14': '课',
                  '2021-07-16': '课',
                  '2021-07-02': '休',
                  '2021-07-01': '休',
                  '2021-07-31': '课',
                  '2021-09-30': '课',
                  '2021-09-29': '课',
                  '2021-08-18': '课',
                  '2021-10-28': '休',
                  '2021-10-15': '休',
                  '2021-10-11': '课',
                };
                setState(() {});
              }
            },
          ),
        ]),
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter项目中使用flutter_plugin_calendar(注意:实际插件名称可能是flutter_local_notifications或其他,因为flutter_plugin_calendar并不是官方或广泛认可的插件名称,但我会假设你想要实现日历功能,通常会涉及到本地通知或日历访问,这里以flutter_local_notifications为例,因为它提供了日历事件功能)的示例代码。

首先,你需要在pubspec.yaml文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_local_notifications: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以使用以下代码来创建和显示日历事件。以下是一个简单的示例,展示如何初始化插件、创建日历事件以及处理权限请求。

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Calendar Example'),
        ),
        body: Center(
          child: CalendarButton(),
        ),
      ),
    );
  }
}

class CalendarButton extends StatefulWidget {
  @override
  _CalendarButtonState createState() => _CalendarButtonState();
}

class _CalendarButtonState extends State<CalendarButton> {
  final FlutterLocalNotificationsPlugin flutterLocalNotificationsPlugin =
      FlutterLocalNotificationsPlugin();

  @override
  void initState() {
    super.initState();
    _requestIOSPermissions();
    _configureLocalNotifications();
  }

  void _requestIOSPermissions() {
    // 请求iOS通知权限
    if (Platform.isIOS) {
      flutterLocalNotificationsPlugin
          .requestIOSPermissions(
            alert: true,
            badge: true,
            sound: true,
          )
          .then((_) => {
            if (!_.granted) {
              // 权限未授予,可以处理相关逻辑
            }
          });
    }
  }

  void _configureLocalNotifications() {
    var initializationSettingsAndroid = AndroidInitializationSettings('@mipmap/ic_launcher');
    var initializationSettingsIOS = IOSInitializationSettings(
      requestAlertPermission: true,
      requestBadgePermission: true,
      requestSoundPermission: true,
    );
    var initializationSettings = InitializationSettings(
      android: initializationSettingsAndroid,
      iOS: initializationSettingsIOS,
    );

    flutterLocalNotificationsPlugin.initialize(initializationSettings,
        onSelectNotification: (String? payload) async {
      if (payload != null) {
        // 处理点击通知的逻辑
        showDialog(
          context: context,
          builder: (_) => AlertDialog(
            title: Text('Payload'),
            content: Text(payload!),
            actions: <Widget>[
              TextButton(
                onPressed: () => Navigator.of(context).pop(),
                child: Text('OK'),
              ),
            ],
          ),
        );
      }
    });
  }

  void _scheduleCalendarEvent() async {
    var dateTime = DateTime.now().add(Duration(days: 1));
    var rRule = RecurrenceRule.weekly(); // 每周重复

    var androidDetails = AndroidNotificationDetails(
      'channel_id',
      'Channel Name',
      'Channel Description',
      importance: Importance.max,
      priority: Priority.high,
      ticker: 'ticker',
      showWhen: true,
      autoCancel: true,
      color: Colors.blue,
      vibrationPattern: [1000, 500, 1000],
      platformSound: RawResourceAndroidNotificationSound('default_sound'),
      playSound: true,
      enableLights: true,
      ledColor: Colors.red,
      ledOnMs: 1000,
      ledOffMs: 500,
      allowWhileIdle: true,
      ongoing: false,
      onlyAlertOnce: true,
      category: 'message',
      visibility: NotificationVisibility.public,
      notificationLayout: 'custom_layout',
    );

    var iOSDetails = IOSNotificationDetails();

    var platformChannelSpecifics = NotificationDetails(
      android: androidDetails,
      iOS: iOSDetails,
    );

    await flutterLocalNotificationsPlugin.schedule(
      0,
      'Event Title',
      'Event Body',
      dateTime,
      platformChannelSpecifics,
      payload: 'Event Payload',
      rRule: rRule,
    );
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton(
      onPressed: _scheduleCalendarEvent,
      child: Text('Schedule Calendar Event'),
    );
  }
}

在这个示例中:

  1. 我们初始化了FlutterLocalNotificationsPlugin
  2. 请求了iOS的通知权限。
  3. 配置了本地通知的设置。
  4. 创建了一个按钮,点击该按钮时会在日历中创建一个事件,该事件每周重复一次。

请注意,flutter_local_notifications插件本身可能并不直接支持在Google Calendar或iOS日历中创建事件,它主要用于在设备的本地通知系统中创建和管理通知。如果你需要在Google Calendar或iOS日历中创建事件,你可能需要使用其他插件或服务,如device_calendar插件,它允许你访问和修改设备上的日历事件。

确保你阅读并遵循所选插件的官方文档,因为不同插件的API和配置方式可能会有所不同。

回到顶部