首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fluttter Alarm Manager缺少插件异常

Fluttter Alarm Manager缺少插件异常
EN

Stack Overflow用户
提问于 2019-12-21 21:43:42
回答 2查看 1K关注 0票数 4

我在设置完成某些功能的日常任务时遇到了问题。我已经设法让android_alarm_manager工作了,目前已经将其设置为每分钟在日志中打印一条消息用于测试目的,但将在完成后每天设置它。下面是我的代码:

代码语言:javascript
复制
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);
}

当警报触发时,我会得到如下所示的工作打印消息和错误消息

代码语言:javascript
复制
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的新手,正在努力理解如何给闹钟管理器提供我需要它使用的插件。

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

提前感谢你帮我弄清楚这件事。如果我没有理解警报管理器是如何正确工作的,我深表歉意。

EN

回答 2

Stack Overflow用户

发布于 2019-12-22 12:20:05

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

假设这不是一个在Flutter 1.12之上创建的全新项目,你不能在后台使用其他插件,除非经历更多的困难。

当您执行警报回调时,该回调实际上是在另一个隔离上运行的(基本上是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类应该如下所示:

代码语言:javascript
复制
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作为入口点:

代码语言:javascript
复制
   <application
        android:name=".Application"
        ...

一旦你做到了这一点,你应该能够使用来自package:android_alarm_manager产生的隔离的其他插件。有一个例外,那就是你在Flutter 1.12发布后创建了一个全新的Flutter应用程序,在这种情况下,最新版本的插件应该会自动为你做这件事。如果是这样的话,可能出了什么问题,你会想要在GitHub上提交一个问题。

票数 2
EN

Stack Overflow用户

发布于 2020-03-09 21:53:40

我正在使用Flutter v1.12,并且我已经有了MissingPluginException。我解决了我的问题,在我的应用程序类中注册SharedPreferences:

代码语言:javascript
复制
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"));
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59436679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档