Fluttter Alarm Manager缺少插件异常

时间:2019-12-21 13:43:41

标签: android flutter dart alarmmanager android-alarms

我在设置日常任务以完成某些功能时遇到麻烦。我设法使android_alarm_manager工作,目前已将其设置为每分钟在日志中打印一条消息以进行测试,但完成后将每天进行设置。下面是我的代码:

$skip

警报响起时,我会收到示例中的正常打印消息,并收到类似这样的错误

void printHello() async{
  final DateTime now = DateTime.now();
  final int isolateId = Isolate.current.hashCode;
  print("[$now] Hello, world! isolate=${isolateId} function='$printHello'");

  int myValue = await getData();

  print("Test Value: $myValue");
}

Future<int> getData() async{
  SharedPreferences sharedPreferences = await SharedPreferences.getInstance();

  return sharedPreferences.getInt("testInt");
}

main() async {
  WidgetsFlutterBinding.ensureInitialized();
  final int helloAlarmID = 0;
  await AndroidAlarmManager.initialize();
  runApp(MyApp());
  await AndroidAlarmManager.periodic(const Duration(minutes: 1), helloAlarmID, printHello);
}

我仍然是Android和Flutter的新手,并且正在努力了解如何为警报管理器提供所需的插件。

您甚至还可以提供“警报管理器”插件,例如“共享首选项”吗?

在此感谢您为我提供的任何帮助。抱歉,如果我不了解警报管理器应如何正常工作。

2 个答案:

答案 0 :(得分:1)

我是android_alarm_manager插件的主要维护者。

假设这不是在Flutter 1.12之上创建的全新项目,那么您不能在不使用其他两个箍的情况下从后台使用其他插件。

当您执行警报回调时,该回调实际上是在另一个Isolate(基本上是Dart的一个线程版本,不与其他线程共享内存)上运行。当Flutter启动应用程序的主要隔离时,它需要使用该隔离来注册应用程序中的所有插件,以便可以初始化所有插件并准备处理来自Dart代码的消息。这是在Flutter调用GeneratedPluginRegistrant.registerWith(一种自动生成的方法,用于处理应用程序的插件注册)时在启动时完成的。但是,由于android_alarm_manager插件产生的隔离不会像主隔离那样进行相同的初始化,因此不会在后台自动完成,因为可以随时生成它来处理警报事件,因此产生隔离的插件负责注册所有插件。

TL; DR :对于android_alarm_manager插件here,您必须按照自述文件中列出的几个步骤进行操作,但基本上,您需要这样做以下:

  • Application添加一个自定义实现,该实现扩展了FlutterApplication并实现了PluginRegistrantCallback。在onCreate中,您将要呼叫AlarmService.setPluginRegistrant(this)。最后,您需要实现void registerWith(PluginRegistry registry)并调用GeneratedPluginRegistrant.registerWith(registry)

完成后,您的Application类应如下所示:

public class Application extends FlutterApplication implements PluginRegistrantCallback {
  @Override
  public void onCreate() {
    super.onCreate();
    AlarmService.setPluginRegistrant(this);
  }

  // This method is called by AlarmService to register the plugins with the
  // isolate it spawns to execute code in the background.
  @Override
  public void registerWith(PluginRegistry registry) {
    // GeneratedPluginRegistrant is auto-generated and contains all the plugin
    // registration code.
    GeneratedPluginRegistrant.registerWith(registry);
  }
}
  • 实现Application类后,您还需要更新AndroidManifest.xml以使用自定义Application作为入口点:
   <application
        android:name=".Application"
        ...

完成此操作后,您应该可以使用package:android_alarm_manager产生的隔离物中的其他插件。 一个例外是,如果您从Flutter 1.12版本开始创建了一个全新的Flutter应用程序,在这种情况下,最新版本的插件应自动为您执行此操作。可能已损坏,您需要在GitHub上提交问题。

答案 1 :(得分:1)

我正在使用Flutter v1.12,但是还缺少MissingPluginException。我解决了我的问题,在我的Application类中注册了SharedPreferences:

import io.flutter.app.FlutterApplication
import io.flutter.plugin.common.PluginRegistry
import io.flutter.plugin.common.PluginRegistry.PluginRegistrantCallback
import io.flutter.plugins.androidalarmmanager.AlarmService
import io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin


class Application : FlutterApplication(), PluginRegistrantCallback {
    override fun onCreate() {
        super.onCreate()
        AlarmService.setPluginRegistrant(this)
    }

    override fun registerWith(registry: PluginRegistry?) {
        //Register sharedPreferences here        
        SharedPreferencesPlugin.registerWith(registry?.registrarFor(
        "io.flutter.plugins.sharedpreferences.SharedPreferencesPlugin"));
    }
}