Flutter提醒功能插件reminders的使用

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

Flutter提醒功能插件reminders的使用

简介

reminders 是一个简单的 Flutter 插件,用于在 iOS 和 macOS 上提供对 Apple Reminders 的读取、写入、编辑和删除操作。该插件允许开发者创建、修改和管理用户的提醒事项。

API 介绍

  1. 请求权限

    • Future<bool> requestPermission()
      • 请求访问用户提醒事项的权限。如果用户尚未授予权限,将弹出系统对话框提示用户授权。返回 true 表示用户已授予权限(或之前已授予权限),返回 false 表示用户拒绝了权限(或之前已拒绝)。
  2. 检查是否有访问权限

    • Future<bool> hasAccess()
      • 检查是否已经获得了访问提醒事项的权限。
  3. 获取默认提醒事项列表ID

    • Future<String?> getDefaultListId()
      • 获取默认提醒事项列表的 ID。
  4. 获取默认提醒事项列表

    • Future<RemList?> getDefaultList()
      • 获取默认的提醒事项列表。
  5. 获取所有提醒事项列表

    • Future<List<RemList>> getAllLists()
      • 获取所有提醒事项列表。
  6. 获取指定列表中的所有提醒事项

    • Future<List<Reminder>?> getReminders([String? id])
      • 通过传递 RemList.id 获取指定列表中的所有提醒事项。
  7. 保存提醒事项

    • Future<Reminder> saveReminder(Reminder reminder)
      • 保存或更新提醒事项。可以用于创建新提醒事项或修改现有提醒事项。
  8. 删除提醒事项

    • Future<String?> deleteReminder(String id)
      • 通过传递 Reminder.id 删除指定的提醒事项。

平台集成

iOS 集成
  • iOS 17 及以下版本

    <key>NSRemindersUsageDescription</key>
    <string>INSERT_REASON_HERE</string>
    
  • iOS 17 及以上版本

    <key>NSRemindersFullAccessUsageDescription</key>
    <string>INSERT_REASON_HERE</string>
    

    注意:尽管 NSRemindersUsageDescription 在 iOS 17 中是向前兼容的,但在 iPadOS 17 中编译时可能会出现问题。因此,建议无论哪种情况都添加这两个键。

macOS 集成

macos/Runner/DebugProfile.entitlementsmacos/Runner/Release.entitlements 文件中添加以下内容:

<key>com.apple.security.personal-information.calendars</key>
<true/>
Android、Web、Windows 和 Linux 集成

由于该插件仅支持 Apple Reminders,因此不提供 Android、Web、Windows 或 Linux 的集成。

完整示例 Demo

以下是一个完整的 Flutter 示例代码,展示了如何使用 reminders 插件来管理和显示提醒事项。

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

void main() => runApp(const MaterialApp(
    debugShowCheckedModeBanner: false,
    title: 'Apple Reminders Kit',
    home: ExampleApp()));

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

  [@override](/user/override)
  State<ExampleApp> createState() => _ExampleAppState();
}

class _ExampleAppState extends State<ExampleApp> {
  final reminders = Reminders();

  RemList? currentList;

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 请求访问提醒事项的权限
    reminders.requestPermission();

    return Scaffold(
      appBar: AppBar(
        actions: [
          // 检查是否有访问权限
          FutureBuilder(
              future: reminders.hasAccess(),
              builder: (BuildContext context, AsyncSnapshot<bool> snapshot) {
                final access = snapshot.data ?? false;
                return access
                    ? TextButton(
                        onPressed: () => setState(() {
                          currentList = null;
                        }),
                        child: const Text('Get All'),
                      )
                    : const Icon(Icons.cancel_rounded, color: Colors.red);
              }),
          TextButton(
              onPressed: () => Navigator.push(context,
                  MaterialPageRoute(builder: (context) => const EventsPage())),
              child: const Text('Events')),
        ],
        title: Text(currentList?.title ?? 'All Lists'),
      ),
      drawer: Drawer(
        child: FutureBuilder(
            future: reminders.getAllLists(),
            builder:
                (BuildContext context, AsyncSnapshot<List<RemList>> snapshot) {
              final lists = snapshot.data ?? [];
              return ListView.builder(
                  itemBuilder: (context, index) {
                    return ListTile(
                      title: Text(lists[index].title),
                      onTap: () => setState(() {
                        currentList = lists[index];
                        Navigator.of(context).pop();
                      }),
                    );
                  },
                  itemCount: lists.length);
            }),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          // 创建一个新的提醒事项
          final RemList list = currentList ??
              await reminders.getDefaultList() ??
              RemList('New List');
          final reminder = Reminder(list: list, title: 'Here is a new reminder');
          await reminders.saveReminder(reminder);
          setState(() {});
        },
        child: const Icon(Icons.add),
      ),
      body: buildReminders(currentList?.id),
    );
  }

  Center buildReminders(String? list) {
    return Center(
      child: FutureBuilder(
          future: reminders.getReminders(currentList?.id),
          builder:
              (BuildContext context, AsyncSnapshot<List<Reminder>?> snapshot) {
            if (snapshot.hasData) {
              final List<Reminder> rems = snapshot.data ?? [];
              return ListView.builder(
                  itemCount: rems.length,
                  itemBuilder: (context, index) {
                    final reminder = rems[index];
                    return ListTile(
                      leading: Text('${reminder.priority}'), // 显示优先级
                      title: Row(
                        children: [
                          Expanded(child: Text(reminder.title)), // 显示提醒事项标题
                          GestureDetector(
                            child: Text(
                                reminder.dueDate?.toString() ?? 'No date set'), // 显示截止日期
                            onTap: () async {
                              // 设置当前日期为截止日期
                              final now = DateTime.now();
                              reminder.dueDate =
                                  DateTime(now.year, now.month, now.day);
                              await reminders.saveReminder(reminder);
                              setState(() {});
                            },
                            onDoubleTap: () async {
                              // 移除截止日期
                              reminder.dueDate = null;
                              await reminders.saveReminder(reminder);
                              setState(() {});
                            },
                          )
                        ],
                      ),
                      subtitle: reminder.notes != null
                          ? Text(reminder.notes!) // 显示备注
                          : null,
                      trailing: GestureDetector(
                        child: reminder.isCompleted
                            ? const Icon(Icons.check_box) // 已完成
                            : const Icon(Icons.check_box_outline_blank), // 未完成
                        onTap: () async {
                          // 切换完成状态
                          reminder.isCompleted = !reminder.isCompleted;
                          await reminders.saveReminder(reminder);
                          setState(() {});
                        },
                      ),
                      onLongPress: () async {
                        // 删除提醒事项
                        await reminders.deleteReminder(reminder.id!);
                        setState(() {});
                      },
                    );
                  });
            }

            if (snapshot.hasError) {
              return Center(child: Text(snapshot.error.toString()));
            }

            return const Center(child: CircularProgressIndicator()); // 加载中
          }),
    );
  }
}

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

  [@override](/user/override)
  State<EventsPage> createState() => _EventsPageState();
}

class _EventsPageState extends State<EventsPage> {
  final apple = Events();
  bool hasAccess = false;
  List<Calendar> calendars = [];
  List<Event> events = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    apple.hasEventsAccess().then((r) => setState(() {
          hasAccess = r;
          if (hasAccess) getCalendars();
        }));
  }

  getCalendars() {
    apple.getAllCalendars().then((r) => setState(() {
          calendars = r ?? [];
        }));
  }

  loadCalendar(String id) {
    apple.getEvents(id).then((r) => setState(() => events = r ?? []));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        actions: [
          !hasAccess
              ? TextButton(
                  onPressed: () async {
                    final result = await apple.requestAccess();
                    setState(() {
                      hasAccess = result == 'true';
                    });
                  },
                  child: const Text('Request Access'))
              : const Text('Access granted')
        ],
      ),
      body: Row(
        children: [
          Flexible(
            flex: 1,
            child: ListView(
                shrinkWrap: true,
                children: calendars
                    .map((c) => ListTile(
                          title: TextButton(
                            onPressed: () => loadCalendar(c.id),
                            child: Text(c.title),
                          ),
                        ))
                    .toList()),
          ),
          Flexible(
            flex: 1,
            child: ListView(
              shrinkWrap: true,
              children: (events
                  .map((e) => ListTile(
                        title: Text(e.title),
                        subtitle: Text(e.notes ?? ''),
                      ))
                  .toList()),
            ),
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,以下是一个关于如何在Flutter应用中使用reminders插件来实现提醒功能的示例代码。请注意,由于Flutter的生态系统不断变化,插件的名称和功能也可能有所不同。这里假设有一个名为flutter_reminders的插件(实际上这样的插件可能不存在,但我们可以根据常见的插件使用方式来进行示例说明)。

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

dependencies:
  flutter:
    sdk: flutter
  flutter_reminders: ^x.y.z  # 替换为实际的版本号

然后,运行flutter pub get来安装这个插件。

接下来,你可以在你的Flutter应用中使用这个插件来设置提醒。以下是一个简单的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_reminders/flutter_reminders.dart'; // 假设插件名为flutter_reminders

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Reminders Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: ReminderScreen(),
    );
  }
}

class ReminderScreen extends StatefulWidget {
  @override
  _ReminderScreenState createState() => _ReminderScreenState();
}

class _ReminderScreenState extends State<ReminderScreen> {
  String? reminderTitle;
  DateTime? reminderTime;

  void setReminder() async {
    if (reminderTitle == null || reminderTime == null) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Please enter both title and time')),
      );
      return;
    }

    try {
      // 假设插件提供了setReminder方法
      await FlutterReminders.setReminder(
        title: reminderTitle!,
        dateTime: reminderTime!,
      );
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Reminder set successfully')),
      );
    } catch (e) {
      ScaffoldMessenger.of(context).showSnackBar(
        SnackBar(content: Text('Failed to set reminder: $e')),
      );
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Set Reminder'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            TextField(
              decoration: InputDecoration(labelText: 'Reminder Title'),
              onChanged: (value) {
                reminderTitle = value;
              },
            ),
            SizedBox(height: 16),
            DateTimePicker(
              initialDate: DateTime.now(),
              lastDate: DateTime(DateTime.now().year + 1),
              onChanged: (value) {
                reminderTime = value;
              },
              locale: Localizations.localeOf(context),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: setReminder,
              child: Text('Set Reminder'),
            ),
          ],
        ),
      ),
    );
  }
}

// 注意:DateTimePicker 是一个假设的组件,实际中你可能需要使用 `showDatePicker` 和 `showTimePicker`
// 或者其他日期时间选择库,比如 `flutter_datetime_picker`。

注意

  1. flutter_reminders插件可能不存在,这只是一个假设的例子。实际中,你需要找到并使用一个支持提醒功能的Flutter插件。
  2. DateTimePicker是一个假设的组件,Flutter标准库中并没有直接提供这样的组件。你可能需要使用showDatePickershowTimePicker函数或者集成一个第三方日期时间选择库。
  3. 错误处理是基本的,但你可能需要根据实际需求添加更多的逻辑,比如处理用户权限、存储提醒数据等。

如果你找到了一个具体的提醒功能插件,请参考该插件的官方文档来获取正确的使用方法和API。

回到顶部