Flutter日历添加插件fl_add_to_calender的使用

发布于 1周前 作者 gougou168 来自 Flutter

Flutter日历添加插件fl_add_to_calender的使用

Android集成

在你的应用中,你需要在AndroidManifest.xml文件中添加以下权限,以指示需要修改日历的权限:

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />

iOS集成

对于iOS 10及以上版本的支持,你需要在Info.plist文件中添加以下键值对:

<key>NSCalendarsUsageDescription</key>
<string>访问日历以查看和编辑事件。</string>

对于iOS 17及以上版本的支持,还需要添加以下键值对:

<key>NSCalendarsFullAccessUsageDescription</key>
<string>访问日历以查看和编辑事件。</string>

在Podfile中更新构建设置以启用日历权限,需要在post_install块中添加以下代码:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    flutter_additional_ios_build_settings(target)

    // 在安装了permission_handler后添加以下代码
    target.build_configurations.each do |config|
      config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= [
        '$(inherited)',
        'PERMISSION_EVENTS_FULL_ACCESS=1',
      ]
    end

  end
end

使用

在Dart代码中导入并使用fl_add_to_calender插件:

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

final Event event = Event(
    title: 'Calendar event',
    startTime: '2024-12-28T10:30:00',
    endTime: '2024-12-28T11:30:00',
    eventTimeZone: timezone
);
...
FlAddToCalender.addEvent(context, event);
...

示例代码

以下是完整的示例代码,展示了如何在Flutter应用中使用fl_add_to_calender插件。

import 'dart:io';

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

import 'package:fl_add_to_calender/fl_add_to_calender.dart';
import 'package:permission_handler/permission_handler.dart';

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

class MyApp extends StatefulWidget {
  const MyApp({super.key});

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(home: Home());
  }
}

class Home extends StatefulWidget {
  const Home({super.key});

  [@override](/user/override)
  State<Home> createState() => _HomeState();
}

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

  String evID = "";

  Future<Event> buildEvent() async {
    var timezone = "Asia/kolkata";
    return Event(
        title: 'NB EVENT',
        startTime: '2025-01-10T10:30:00',
        endTime: '2025-01-10T11:30:00',
        eventTimeZone: timezone);
  }

  Future<Event> getUpdateEvent() async {
    var timezone = "Asia/kolkata";
    return Event(
        title: 'NB EVENT Updated ',
        startTime: '2025-01-11T10:30:00',
        endTime: '2025-01-11T11:30:00',
        eventTimeZone: timezone);
  }

  void add() async {
    if (Platform.isAndroid) {
      var status = await Permission.calendarFullAccess.status;
      if (status == PermissionStatus.granted) {
        addEventToCalendar();
      } else if (status == PermissionStatus.permanentlyDenied) {
        ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
          content: Text("Error adding event to calendar: Permission denied"),
          backgroundColor: Colors.red,
        ));
        Future.delayed(const Duration(seconds: 2), () {
          openAppSettings();
        });
      } else {
        if (await Permission.calendarFullAccess.request().isGranted) {
          addEventToCalendar();
        } else {
          ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
            content: Text("Error adding event to calendar: Permission denied"),
            backgroundColor: Colors.red,
          ));
        }
      }
    } else {
      var status = await Permission.calendarWriteOnly.status;
      if (status == PermissionStatus.granted) {
        addEventToCalendar();
      } else if (status == PermissionStatus.permanentlyDenied) {
        ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
          content: Text("Error adding event to calendar: Permission denied"),
          backgroundColor: Colors.red,
        ));
        Future.delayed(const Duration(seconds: 2), () {
          openAppSettings();
        });
      } else {
        if (await Permission.calendarWriteOnly.request().isGranted) {
          addEventToCalendar();
        } else {
          ScaffoldMessenger.of(context).showSnackBar(const SnackBar(
            content: Text("Error adding event to calendar: Permission denied"),
            backgroundColor: Colors.red,
          ));
        }
      }
    }
  }

  void addEventToCalendar() async {
    await FlAddToCalender.addEvent(context, event: await buildEvent(),
        onSubmitted: (id) {
      evID = id;
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: Text('Event added to calendar successfully ! ID = ${id}'),
        backgroundColor: Colors.green,
      ));
    }, onError: (e) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: Text('Error $e'),
        backgroundColor: Colors.red,
      ));
    });
  }

  void updateEvent(String eventId) async {
    await FlAddToCalender.updateEvent(context, eventId: eventId, event: await getUpdateEvent(),
        onSubmitted: (status) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: Text(status),
        backgroundColor: Colors.green,
      ));
    }, onError: (e) {
      ScaffoldMessenger.of(context).showSnackBar(SnackBar(
        content: Text('Error $e'),
        backgroundColor: Colors.red,
      ));
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Fl Add To Calender'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          crossAxisAlignment: CrossAxisAlignment.center,
          children: [
            InkWell(
              onTap: () async {
                add();
              },
              child: Container(
                width: 200,
                height: 50,
                color: Colors.amber,
                child: const Center(child: Text("Add Event")),
              ),
            ),
            const SizedBox(height: 50,),
            InkWell(
              onTap: () async {
                updateEvent(evID);
              },
              child: Container(
                width: 200,
                height: 50,
                color: Colors.red,
                child: const Center(child: Text("Update Event")),
              ),
            )
          ],
        ),
      ),
    );
  }
}

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

1 回复

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


当然,以下是如何在Flutter项目中使用fl_add_to_calendar插件来将事件添加到日历的一个示例。这个插件允许你将事件直接添加到用户的日历中。

首先,确保你已经在pubspec.yaml文件中添加了fl_add_to_calendar依赖:

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

然后,运行flutter pub get来获取依赖。

接下来,在你的Dart文件中导入插件并编写代码来添加事件。以下是一个完整的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Add Event to Calendar'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: _addEventToCalendar,
            child: Text('Add Event'),
          ),
        ),
      ),
    );
  }

  Future<void> _addEventToCalendar() async {
    // 创建事件数据
    var event = CalendarEvent(
      title: 'Flutter Conference',
      description: 'Join us for the Flutter Conference!',
      location: 'Online',
      start: DateTime(2023, 12, 15, 10, 0),
      end: DateTime(2023, 12, 15, 16, 0),
      // 可选字段
      recurrenceRule: RecurrenceRule.daily(), // 每天重复
      // recurrenceRule: RecurrenceRule.weekly(daysOfWeek: [DayOfWeek.monday, DayOfWeek.wednesday, DayOfWeek.friday]), // 每周重复
      // recurrenceRule: RecurrenceRule.monthly(dayOfMonth: 15), // 每月重复
      // reminders: [
      //   CalendarReminder(minutes: 1),
      //   CalendarReminder(minutes: 15),
      // ],
    );

    // 检查平台权限
    if (await FlAddToCalendar.hasPermissions()) {
      // 添加事件到日历
      var result = await FlAddToCalendar.addEvent2Calendar(
        event: event,
        androidOptions: AndroidCalendarOptions(
          calendarId: await FlAddToCalendar.retrieveCalendars(), // 获取所有日历ID,可以选择特定ID
        ),
        iosOptions: IOSCalendarOptions(
          withAlert: true, // 是否在添加事件时弹出提示
        ),
      );

      if (result.success) {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Event added successfully!')),
        );
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Failed to add event: ${result.message}')),
        );
      }
    } else {
      // 请求权限
      var permissionResult = await FlAddToCalendar.requestPermissions();
      if (permissionResult) {
        // 再次尝试添加事件
        await _addEventToCalendar();
      } else {
        ScaffoldMessenger.of(context).showSnackBar(
          SnackBar(content: Text('Permission denied')),
        );
      }
    }
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当用户点击按钮时,应用会尝试将事件添加到用户的日历中。

注意事项

  1. 权限处理:在Android和iOS上,添加事件到日历通常需要用户授予权限。fl_add_to_calendar插件提供了检查和处理这些权限的方法。
  2. 平台特定选项:你可以根据平台(Android和iOS)传递不同的选项。例如,在Android上,你可能需要指定一个日历ID;在iOS上,你可以指定是否在添加事件时显示提示。
  3. 事件重复:插件支持事件的重复规则,例如每天、每周或每月重复。

确保在实际部署前测试所有功能,并根据需要进行调整。

回到顶部