Android Flutter 中的 Alarm Manager Plus 从不触发 oneShot
Android Alarm Manager Plus in Flutter never fires oneShot
我正在尝试处理几乎完全未记录的 Android Alarm Manager Plus,并有一个非常简单的应用程序来按下按钮、设置警报并触发警报,如下所示:
import 'package:flutter/material.dart';
import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.pink,
),
home: SetAlarmPage(),
);
}
}
class SetAlarmPage extends StatefulWidget {
const SetAlarmPage({Key? key}) : super(key: key);
@override
State<SetAlarmPage> createState() => _SetAlarmPageState();
}
class _SetAlarmPageState extends State<SetAlarmPage> {
String test = "Press Me!";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Set an Alarm")),
body: Center(
child: ElevatedButton(
child: Text(test),
onPressed: () {
print(test + " Button Pressed...");
setAlarm();
},
),
),
floatingActionButton:
FloatingActionButton(onPressed: null, child: Icon(Icons.add)),
);
}
void setAlarm() async {
print("setAlarm");
final int alarmID = 1;
await AndroidAlarmManager.oneShot(Duration(minutes: 1), alarmID, playAlarm);
}
void playAlarm() {
print("playAlarm");
setState(() {
test = "Pressed!";
});
}
}
我设法启动了警报服务,但除此之外,什么也没有。我尝试在 main 和 setAlarm 中初始化 AndroidAlarmManager 对象,尝试在 ensureInitialized 中移动,尝试在 oneShot 中设置不同的持续时间,尝试更改 ID,并尝试触发更简单的警报功能。无论我做什么,闹钟都不会响起。
我很确定它很简单,但是对于 android 的核心功能,没有关于如何使用它的真正文档可言。
有谁知道 android 警报管理器想要什么我没有在这里提供?
您首先添加了所需的 AndroidManifest.xml
标签了吗?
第二件事,通过阅读 https://pub.dev/packages/android_alarm_manager_plus 上的文档,回调在单独的 Isolate 上执行,因此您不能从实例传递函数 class,因为 isolate 不共享内存(隔离是 运行 另一个线程上的一段代码)。
您可以通过使用 print 语句添加静态函数来确保插件正常工作(您不能从静态函数调用 setState)
将playAlarm函数改成:
static void playAlarm() {
print("playAlarm");
}
此函数用于验证插件是否正常工作
我正在尝试处理几乎完全未记录的 Android Alarm Manager Plus,并有一个非常简单的应用程序来按下按钮、设置警报并触发警报,如下所示:
import 'package:flutter/material.dart';
import 'package:android_alarm_manager_plus/android_alarm_manager_plus.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await AndroidAlarmManager.initialize();
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.pink,
),
home: SetAlarmPage(),
);
}
}
class SetAlarmPage extends StatefulWidget {
const SetAlarmPage({Key? key}) : super(key: key);
@override
State<SetAlarmPage> createState() => _SetAlarmPageState();
}
class _SetAlarmPageState extends State<SetAlarmPage> {
String test = "Press Me!";
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Set an Alarm")),
body: Center(
child: ElevatedButton(
child: Text(test),
onPressed: () {
print(test + " Button Pressed...");
setAlarm();
},
),
),
floatingActionButton:
FloatingActionButton(onPressed: null, child: Icon(Icons.add)),
);
}
void setAlarm() async {
print("setAlarm");
final int alarmID = 1;
await AndroidAlarmManager.oneShot(Duration(minutes: 1), alarmID, playAlarm);
}
void playAlarm() {
print("playAlarm");
setState(() {
test = "Pressed!";
});
}
}
我设法启动了警报服务,但除此之外,什么也没有。我尝试在 main 和 setAlarm 中初始化 AndroidAlarmManager 对象,尝试在 ensureInitialized 中移动,尝试在 oneShot 中设置不同的持续时间,尝试更改 ID,并尝试触发更简单的警报功能。无论我做什么,闹钟都不会响起。
我很确定它很简单,但是对于 android 的核心功能,没有关于如何使用它的真正文档可言。
有谁知道 android 警报管理器想要什么我没有在这里提供?
您首先添加了所需的 AndroidManifest.xml
标签了吗?
第二件事,通过阅读 https://pub.dev/packages/android_alarm_manager_plus 上的文档,回调在单独的 Isolate 上执行,因此您不能从实例传递函数 class,因为 isolate 不共享内存(隔离是 运行 另一个线程上的一段代码)。 您可以通过使用 print 语句添加静态函数来确保插件正常工作(您不能从静态函数调用 setState)
将playAlarm函数改成:
static void playAlarm() {
print("playAlarm");
}
此函数用于验证插件是否正常工作