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");
  }

此函数用于验证插件是否正常工作