Flutter闹钟管理插件naal_alarm的使用

Flutter闹钟管理插件naal_alarm的使用

naal_alarm 是一个用于在Android平台上实现后台闹钟触发功能的Flutter插件。它允许应用程序在特定时间启动,并且可以像系统闹钟应用一样工作。

安装

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

dependencies:
  naal_alarm: ^1.0.0

或者通过命令行安装:

flutter pub add naal_alarm

初始化

在应用程序启动时,确保调用 WidgetsFlutterBinding.ensureInitialized() 并初始化闹钟插件:

void main() {
  // 确保在初始化之前绑定
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化闹钟插件
  FlutterAlarmBackgroundTrigger.initialize();

  runApp(const MyApp());
}

创建实例

创建一个闹钟插件实例以便后续操作:

var alarmPlugin = FlutterAlarmBackgroundTrigger();

设置闹钟

设置一个闹钟,该闹钟将在10秒后触发。你可以选择性地指定 uidpayload,并且可以设置屏幕唤醒的时间:

alarmPlugin.addAlarm(
  // 必填参数:闹钟触发时间
  DateTime.now().add(Duration(seconds: 10)),

  // 可选参数:用于标识闹钟的唯一ID
  uid: "YOUR_APP_ID_TO_IDENTIFY",

  // 可选参数:额外数据
  payload: {"YOUR_EXTRA_DATA":"FOR_ALARM"},

  // 可选参数:闹钟触发时屏幕保持唤醒的时间
  screenWakeDuration: Duration(minutes: 1)
);

接收闹钟触发事件

请求权限并监听闹钟触发事件。当闹钟触发时,可以在前台或后台执行相应的操作:

alarmPlugin.requestPermission().then((isGranted) {
  if (isGranted) {
    alarmPlugin.onForegroundAlarmEventHandler((alarm) {
      // 执行你的操作,例如导航
      print(alarm.id);
    });
  }
});

其他方法

请求权限以绘制其他应用

请求用户授权以允许应用在其他应用之上绘制:

Future<bool> requestPermission();

添加闹钟

添加一个新的闹钟:

Future<AlarmItem> addAlarm(
  DateTime time, 
  {
    String? uid, 
    Map<String, dynamic>? payload, 
    Duration screenWakeDuration
  }
);

获取闹钟列表

根据不同的条件获取闹钟列表:

// 根据唯一ID获取闹钟
Future<List<AlarmItem>> getAlarmByUid(String uid);

// 获取所有已安排的闹钟
Future<List<AlarmItem>> getAllAlarms();

// 根据闹钟ID获取单个闹钟
Future<AlarmItem> getAlarm(int id);

// 根据额外数据获取闹钟
Future<List<AlarmItem>> getAlarmByPayload(Map<String, dynamic> payload);

// 根据时间获取闹钟
Future<List<AlarmItem>> getAlarmByTime(DateTime time);

删除闹钟

根据不同的条件删除闹钟:

// 根据闹钟ID删除单个闹钟
Future<void> deleteAlarm(int id);

// 根据额外数据删除多个闹钟
Future<void> deleteAlarmsByPayload(Map<String, dynamic> payload);

// 根据时间删除多个闹钟
Future<void> deleteAlarmsByTime(DateTime dateTime);

// 根据唯一ID删除多个闹钟
Future<void> deleteAlarmsByUid(String uid);

// 删除所有已安排的闹钟
Future<void> deleteAllAlarms();

示例代码

以下是一个完整的示例代码,展示了如何使用 naal_alarm 插件来管理闹钟:

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

import 'package:naal_alarm/flutter_alarm_background_trigger.dart';
import 'package:date_time_picker/date_time_picker.dart';
import 'package:naal_alarm_example/alarm_service.dart';

void main() {
  WidgetsFlutterBinding.ensureInitialized();

  // 初始化闹钟插件
  FlutterAlarmBackgroundTrigger.initialize();

  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

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

class _MyAppState extends State<MyApp> {
  AlarmItem? _alarmItem;
  DateTime? time;
  List<AlarmItem> alarms = [];

  [@override](/user/override)
  void initState() {
    super.initState();
    reloadAlarms();
    AlarmService.instance.onForegroundAlarmEventHandler((alarmItem) {
      reloadAlarms();
    });
  }

  reloadAlarms() {
    AlarmService.instance.getAllAlarms().then((alarmsList) => setState(() {
          alarms = alarmsList;
        }));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Builder(builder: (context) {
          return Center(
            child: Column(
              mainAxisAlignment: MainAxisAlignment.center,
              crossAxisAlignment: CrossAxisAlignment.center,
              children: [
                Card(
                  margin: const EdgeInsets.all(10),
                  child: Padding(
                    padding: const EdgeInsets.all(8.0),
                    child: Row(
                      children: [
                        Expanded(
                            child: DateTimePicker(
                          type: DateTimePickerType.dateTime,
                          initialValue: '',
                          firstDate: DateTime.now(),
                          lastDate: DateTime.now().add(const Duration(days: 365)),
                          dateLabelText: 'Alarm date time',
                          onChanged: (val) => setState(() {
                            time = DateTime.parse(val);
                          }),
                        )),
                        ElevatedButton(
                            onPressed: createAlarm,
                            child: const Text("Set Alarm"))
                      ],
                    ),
                  ),
                ),
                Expanded(
                  child: ListView.builder(
                    itemCount: alarms.length,
                    itemBuilder: (ctx, idx) => ((AlarmItem alarm) => ListTile(
                          title: Row(
                            children: [
                              Text(alarm.time!.toString()),
                              const SizedBox(width: 5),
                              Chip(
                                padding: EdgeInsets.zero,
                                label: Text(describeEnum(alarm.status),
                                    style: TextStyle(
                                        color: alarm.status == AlarmStatus.DONE
                                            ? Colors.black
                                            : Colors.white,
                                        fontSize: 10)),
                                backgroundColor:
                                    alarm.status == AlarmStatus.DONE
                                        ? Colors.greenAccent
                                        : Colors.redAccent,
                              )
                            ],
                          ),
                          subtitle: Text(
                              "ID: ${alarm.id}, UID: ${alarm.uid}, Payload: ${alarm.payload.toString()}"),
                          trailing: IconButton(
                              onPressed: () async {
                                await AlarmService.instance
                                    .deleteAlarm(alarm.id!);
                                reloadAlarms();
                              },
                              icon:
                                  const Icon(Icons.delete, color: Colors.red)),
                        ))(alarms[idx]),
                  ),
                )
              ],
            ),
          );
        }),
      ),
    );
  }

  void createAlarm() async {
    await AlarmService.instance
        .addAlarm(time!, uid: "TEST UID", payload: {"holy": "Moly"});
    reloadAlarms();
  }
}

更多关于Flutter闹钟管理插件naal_alarm的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

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


naal_alarm 是一个用于在 Flutter 应用中管理闹钟的插件。它允许你创建、更新、删除和触发闹钟。以下是如何使用 naal_alarm 插件的基本步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 naal_alarm 插件的依赖。

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

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

2. 导入插件

在你的 Dart 文件中导入 naal_alarm 插件。

import 'package:naal_alarm/naal_alarm.dart';

3. 请求权限

在 Android 上,你需要请求 SCHEDULE_EXACT_ALARM 权限来设置精确的闹钟。

import 'package:permission_handler/permission_handler.dart';

Future<void> requestAlarmPermission() async {
  if (await Permission.scheduleExactAlarm.request().isGranted) {
    // 权限已授予
  } else {
    // 权限被拒绝
  }
}

4. 创建闹钟

使用 NaalAlarm.createAlarm 方法来创建一个新的闹钟。

Future<void> createAlarm() async {
  final alarmId = 1; // 闹钟的唯一 ID
  final alarmTime = DateTime.now().add(Duration(minutes: 10)); // 闹钟时间
  final alarmTitle = "My Alarm"; // 闹钟标题
  final alarmDescription = "Time to wake up!"; // 闹钟描述

  await NaalAlarm.createAlarm(
    alarmId: alarmId,
    alarmTime: alarmTime,
    alarmTitle: alarmTitle,
    alarmDescription: alarmDescription,
  );
}

5. 更新闹钟

你可以使用 NaalAlarm.updateAlarm 方法来更新现有的闹钟。

Future<void> updateAlarm() async {
  final alarmId = 1; // 要更新的闹钟 ID
  final newAlarmTime = DateTime.now().add(Duration(minutes: 20)); // 新的闹钟时间
  final newAlarmTitle = "Updated Alarm"; // 新的闹钟标题
  final newAlarmDescription = "Updated time to wake up!"; // 新的闹钟描述

  await NaalAlarm.updateAlarm(
    alarmId: alarmId,
    alarmTime: newAlarmTime,
    alarmTitle: newAlarmTitle,
    alarmDescription: newAlarmDescription,
  );
}

6. 删除闹钟

使用 NaalAlarm.deleteAlarm 方法来删除现有的闹钟。

Future<void> deleteAlarm() async {
  final alarmId = 1; // 要删除的闹钟 ID

  await NaalAlarm.deleteAlarm(alarmId: alarmId);
}

7. 监听闹钟触发

你可以使用 NaalAlarm.onAlarmTriggered 来监听闹钟的触发事件。

void listenToAlarm() {
  NaalAlarm.onAlarmTriggered.listen((alarmId) {
    print("Alarm triggered with ID: $alarmId");
    // 在这里处理闹钟触发后的逻辑
  });
}

8. 检查闹钟是否存在

你可以使用 NaalAlarm.checkAlarmExists 方法来检查某个闹钟是否存在。

Future<void> checkAlarmExists() async {
  final alarmId = 1; // 要检查的闹钟 ID

  final exists = await NaalAlarm.checkAlarmExists(alarmId: alarmId);
  print("Alarm exists: $exists");
}

9. 获取所有闹钟

你可以使用 NaalAlarm.getAllAlarms 方法来获取所有已设置的闹钟。

Future<void> getAllAlarms() async {
  final alarms = await NaalAlarm.getAllAlarms();
  print("All alarms: $alarms");
}

10. 取消所有闹钟

你可以使用 NaalAlarm.cancelAllAlarms 方法来取消所有已设置的闹钟。

Future<void> cancelAllAlarms() async {
  await NaalAlarm.cancelAllAlarms();
}

11. 处理后台任务

如果闹钟触发时应用在后台运行,你可能需要在 AndroidManifest.xml 中配置后台服务来处理闹钟触发事件。

<service
    android:name="com.example.alarm.BackgroundService"
    android:enabled="true"
    android:exported="false" />

12. 处理闹钟触发后的逻辑

你可以在 NaalAlarm.onAlarmTriggered 的监听器中处理闹钟触发后的逻辑,例如显示通知、播放声音等。

void handleAlarmTrigger() {
  NaalAlarm.onAlarmTriggered.listen((alarmId) async {
    // 显示通知
    await FlutterLocalNotificationsPlugin().show(
      0,
      'Alarm Triggered',
      'Time to wake up!',
      NotificationDetails(
        android: AndroidNotificationDetails(
          'alarm_channel',
          'Alarm Notifications',
          importance: Importance.high,
          priority: Priority.high,
        ),
      ),
    );

    // 播放声音
    // 例如使用 `audioplayers` 插件播放声音
  });
}
回到顶部