我在设置日常任务以完成某些功能时遇到麻烦。我设法使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的新手,并且正在努力了解如何为警报管理器提供所需的插件。
您甚至还可以提供“警报管理器”插件,例如“共享首选项”吗?
在此感谢您为我提供的任何帮助。抱歉,如果我不了解警报管理器应如何正常工作。
答案 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"));
}
}