我在设置日常任务以完成某些功能时遇到麻烦。我设法使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_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上提交问题。