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秒后触发。你可以选择性地指定 uid
和 payload
,并且可以设置屏幕唤醒的时间:
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
更多关于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` 插件播放声音
});
}