Fluttter警报管理器缺少插件异常

问题描述 投票:0回答:1

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

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

当警报响起时,我会收到示例中的工作打印消息,并出现类似这样的错误

I/flutter (22910): [2019-12-21 13:34:09.526343] Hello, world! isolate=957159586 function='Closure: () => void from Function 'printHello': static.'
E/flutter (22910): [ERROR:flutter/lib/ui/ui_dart_state.cc(157)] Unhandled Exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)
E/flutter (22910): #0      getData (package:my_jungle_2/main.dart:34:41)
E/flutter (22910): <asynchronous suspension>
E/flutter (22910): #1      printHello (package:my_jungle_2/main.dart:28:23)
E/flutter (22910): #2      _alarmManagerCallbackDispatcher.<anonymous closure> (package:android_alarm_manager/android_alarm_manager.dart:43:14)
E/flutter (22910): #3      MethodChannel._handleAsMethodCall (package:flutter/src/services/platform_channel.dart:402:55)
E/flutter (22910): #4      MethodChannel.setMethodCallHandler.<anonymous closure> (package:flutter/src/services/platform_channel.dart:370:54)
E/flutter (22910): #5      _DefaultBinaryMessenger.handlePlatformMessage (package:flutter/src/services/binding.dart:200:33)
E/flutter (22910): #6      _invoke3.<anonymous closure> (dart:ui/hooks.dart:303:15)
E/flutter (22910): #7      _rootRun (dart:async/zone.dart:1126:13)
E/flutter (22910): #8      _CustomZone.run (dart:async/zone.dart:1023:19)
E/flutter (22910): #9      _CustomZone.runGuarded (dart:async/zone.dart:925:7)
E/flutter (22910): #10     _invoke3 (dart:ui/hooks.dart:302:10)
E/flutter (22910): #11     _dispatchPlatformMessage (dart:ui/hooks.dart:162:5)

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

您是否还能够提供警报管理器插件,例如共享首选项?

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

android flutter dart alarmmanager android-alarms
1个回答
0
投票

我是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上提交问题。

© www.soinside.com 2019 - 2024. All rights reserved.