Flutter MissingPluginException与几个插件

时间:2018-06-22 09:58:59

标签: flutter

我最近一直在使用一些flutter插件。许多工具运行良好,但是我几次遇到令人沮丧的错误,通常导致放弃了插件。

这是我最后得到的schedule_notifications

Access-Control-Allow-Headers: Range
Access-Control-Expose-Headers: Accept-Ranges, Content-Encoding, Content-Length, Content-Range

SO和GitHub上有许多类似问题的示例(请参阅我的帖子),但唯一建议解决这些问题的方法是“使用E/flutter (24758): [ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception: E/flutter (24758): MissingPluginException(No implementation found for method getIconResourceId on channel schedule_notifications_app) E/flutter (24758): #0 MethodChannel.invokeMethod (package:flutter/src/services/platform_channel.dart:278:7) E/flutter (24758): <asynchronous suspension> E/flutter (24758): #1 _MyAppState._getIconResourceId (<my path>/sandbox/lib/main.dart:67:40) E/flutter (24758): <asynchronous suspension> E/flutter (24758): #2 _MyAppState.initState (<my path>/sandbox/lib/main.dart:24:7) E/flutter (24758): #3 StatefulElement._firstBuild (package:flutter/src/widgets/framework.dart:3751:58) E/flutter (24758): #4 ComponentElement.mount (package:flutter/src/widgets/framework.dart:3617:5) E/flutter (24758): #5 Element.inflateWidget (package:flutter/src/widgets/framework.dart:2907:14) E/flutter (24758): #6 Element.updateChild (package:flutter/src/widgets/framework.dart:2710:12) E/flutter (24758): #7 RenderObjectToWidgetElement._rebuild (package:flutter/src/widgets/binding.dart:857:16) E/flutter (24758): #8 RenderObjectToWidgetElement.mount (package:flutter/src/widgets/binding.dart:828:5) E/flutter (24758): #9 RenderObjectToWidgetAdapter.attachToRenderTree.<anonymous closure> (package:flutter/src/widgets/binding.dart:774:17) E/flutter (24758): #10 BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2222:19) E/flutter (24758): #11 RenderObjectToWidgetAdapter.attachToRenderTree (package:flutter/src/widgets/binding.dart:773:13) E/flutter (24758): #12 _WidgetsFlutterBinding&BindingBase&GestureBinding&ServicesBinding&SchedulerBinding&PaintingBinding&RendererBinding&WidgetsBinding.attachRootWidget (package:flutter/src/widgets/binding.dart:662:7) E/flutter (24758): #13 runApp (package:flutter/src/widgets/binding.dart:704:7) E/flutter (24758): #14 main (<my path>/sandbox/lib/main.dart:8:16) E/flutter (24758): #15 _startIsolate.<anonymous closure> (dart:isolate/runtime/libisolate_patch.dart:279:19) E/flutter (24758): #16 _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:165:12) D/libGLESv2(24758): DTS_GLAPI : DTS is not allowed for Package : <my package> D/libGLESv1(24758): DTS_GLAPI : DTS is not allowed for Package : <my package> D/ViewRootImpl(24758): ViewPostImeInputStage processPointer 0 D/ViewRootImpl(24758): ViewPostImeInputStage processPointer 1 ,{{ 1}},flutter clean,然后是flutter upgrade”。 有时可能就足够了,但并不总是-在我的情况下,我仍然会得到完全相同的错误。

值得注意的是,如果我克隆了插件的整个GitHub存储库,并从此目录中运行示例,那么它将很好地工作。但是,如果我尝试重新创建示例项目,则不会,所以我认为我丢失了一些东西,但是呢?

以下是我重新创建示例的步骤:

  1. 在Android Studio中创建一个新的Flutter项目

  2. 添加依赖项flutter packages get

  3. 在Android Studio中单击Flutter命令flutter runschedule_notifications: ^0.1.8 in pubspec.yaml

  4. 在Android Studio中点击弹出Packages get

  5. https://github.com/serralvo/schedule_notifications/blob/master/example/lib/main.dart中的代码粘贴到我的Packages upgrade文件中

  6. 将行Get packages更改为main.dart,以解决我从Android Studio中收到的错误

  7. import 'package:schedule_notifications_example/time_picker.dart';旁边创建文件import 'time_picker.dart';并将其粘贴到https://github.com/serralvo/schedule_notifications/blob/master/example/lib/time_picker.dart中的代码

  8. 在Android Studio中执行项目并获得上述错误

  9. 启动Flutter控制台并进入我的项目目录

  10. 在控制台中执行命令time_picker.dartmain.dartflutter clean

  11. 在控制台中执行命令flutter upgrade仍然会得到相同的错误

那么,到底发生了什么?对于某些开发人员或某些项目,某些插件会产生这种行为的原因是什么?我在做什么错了?

类似问题的示例:

6 个答案:

答案 0 :(得分:5)

经过12个小时的不懈努力,在一个扑朔迷离的android项目中解决了这个问题...终于解决了-受到“ @rahulserver”解决方案的启发,如下所示

只需在“ MainActivity.java”中合并以下代码

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GeneratedPluginRegistrant.registerWith(this.getFlutterEngine());
}

注意:MainActivity扩展了FlutterActivity

答案 1 :(得分:3)

我遇到了同样的问题,花了我一段时间了解它为什么会发生。 该解决方案很简单,只需杀死该应用程序并运行一个新的应用程序即可。

答案 2 :(得分:1)

好的,我正在发布我发现的内容,以防将来可能对某人有所帮助。 但是我仍然对进一步的解释感兴趣。

因此,要使schedule_notifications插件起作用,我必须在example project中打开文件MainActivity.java。在那里,我注意到我自己的项目中没有出现的几行:

    MethodChannel methodChannel = new MethodChannel(getFlutterView(), "schedule_notifications_app");
    methodChannel.setMethodCallHandler(new MethodChannel.MethodCallHandler() {
      @Override
      public void onMethodCall(MethodCall methodCall, MethodChannel.Result result) {
        if (methodCall.method.equals("getIconResourceId")) {
          result.success(R.mipmap.ic_launcher);
        }
      }
    });

当我将这些行复制并粘贴到自己的MainActivity.java文件中(带有正确的导入)时,我的项目终于可以工作了。

您会注意到,在main.dart中,我们有以下几行:

static const _platform = const MethodChannel('schedule_notifications_app');

iconResourceId = await _platform.invokeMethod('getIconResourceId');

这些链接到MainActivity.java中的新行。这就是问题的根源。

执行这些步骤可以使插件正常工作,但是我不确定这是好方法还是糟糕的方法。如果真的是我们应该做的,我必须说一下相当不明显!我认为至少插件安装文档应该对此进行解释

答案 3 :(得分:0)

添加新插件时,需要重新构建应用程序,热重启不会构建应用程序,并且除非重新构建,否则新添加的项目将不包含在项目中。

答案 4 :(得分:0)

就我而言,我(错误地)从MainActivity.kt(在onCreate挂钩内)删除了这一行

    GeneratedPluginRegistrant.registerWith(this)

可能是个错误,但花了我很多时间。希望可以帮助某人。

答案 5 :(得分:0)

执行flutter cleanflutter pub get。在pubspec.yaml文件中添加任何插件语句后,您需要执行flutter packages get命令。停止运行应用程序,卸载然后重新构建对我来说是有效的。