带有几个插件的 Flutter MissingPluginException

Posted

技术标签:

【中文标题】带有几个插件的 Flutter MissingPluginException【英文标题】:Flutter MissingPluginException with several plugins 【发布时间】:2018-12-01 18:51:35 【问题描述】:

我最近一直在使用一些颤振插件。许多都完美运行,但我几次偶然发现令人沮丧的错误,通常导致放弃插件。

这是我得到的最后一个,schedule_notifications:

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

在 SO 和 GitHub 上有很多类似问题的示例(请参阅我的帖子末尾),但唯一建议解决它们的是“使用 flutter cleanflutter upgradeflutter packages get 然后是 flutter run"。 有时可能就足够了,但并非总是如此 - 在我的特殊情况下,我仍然会遇到完全相同的错误。

值得注意的是,如果我克隆插件的整个 GitHub 存储库并从该目录中运行示例,它确实运行良好。但是如果我尝试重新创建示例项目,它不会,所以我认为我错过了一些东西,但是什么?

这是我重新创建示例所遵循的步骤:

    android Studio 中新建一个 Flutter 项目

    添加依赖schedule_notifications: ^0.1.8 in pubspec.yaml

    在 Android Studio 中点击 Flutter 命令 Packages getPackages upgrade

    在Android Studio出现Get packages时点击弹出窗口

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

    import 'package:schedule_notifications_example/time_picker.dart'; 行更改为import 'time_picker.dart'; 以解决我从Android Studio 得到的错误

    main.dart 旁边创建一个文件time_picker.dart 并将https://github.com/serralvo/schedule_notifications/blob/master/example/lib/time_picker.dart 中的代码粘贴到其中

    在Android Studio中执行项目,出现上述错误

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

    在控制台执行命令flutter cleanflutter upgradeflutter packages get

    在控制台执行命令flutter run依旧报同样的错误

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

类似问题的示例:

MissingPluginException(No implementation found for method init on channel plugins.flutter.io/google_sign_in)

Flutter: google_sign_in plugin MissingPluginException

MissingPluginException while using plugin for flutter

Flutter Test MissingPluginException

Flutter MissingPluginException error

Flutter: Unhandled exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences)

https://github.com/flutter/flutter/issues/10912

【问题讨论】:

这能回答你的问题吗? Flutter: Unhandled exception: MissingPluginException(No implementation found for method getAll on channel plugins.flutter.io/shared_preferences) 【参考方案1】:

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

    GeneratedPluginRegistrant.registerWith(this)

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

【讨论】:

我去 MainActivity.kt 时遇到了同样的问题,我有:package com.example.komerso import androidx.annotation.NonNull;导入 io.flutter.embedding.android.FlutterActivity 导入 io.flutter.embedding.engine.FlutterEngine 导入 io.flutter.plugins.GeneratedPluginRegistrant 类 MainActivity: FlutterActivity() 覆盖有趣的 configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) GeneratedPluginRegistrant.registerWith(颤振引擎); 我错过了什么吗? 这解决了我的问题,似乎如果我们覆盖 "configureFlutterEngine" ,这个方法需要在它的末尾显式调用。 能否提供MainActivity.kt的完整代码?【参考方案2】:

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

【讨论】:

【参考方案3】:

在一个颤振的 android 项目中花了 12 小时的持续努力来解决这个问题......终于解决了 - 受到“@rahulserver”解决方案的启发,如下所示

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

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

注意:MainActivity 扩展了 FlutterActivity

【讨论】:

【参考方案4】:

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

所以,为了使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 中的新行。这就是问题的来源。

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

【讨论】:

【参考方案5】:

我遇到了同样的问题,我花了一段时间才明白为什么会这样。 解决方案很简单,只需终止应用程序并运行一个新应用程序即可。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

我通过稍微修改 Android 构建解决了这个问题。

    转到android/app/build.gradle 添加以下行:
android 

   // other config stuff here

   buildTypes 
       release 
           signingConfig signingConfigs.release

           // Add these 2 lines
           minifyEnabled false   
           shrinkResources false
       
   

我认为这会阻止一些构建优化,这会以某种方式破坏插件注册...

【讨论】:

以上是关于带有几个插件的 Flutter MissingPluginException的主要内容,如果未能解决你的问题,请参考以下文章

当我添加带有克拉符号的预发布版本的依赖项时,Flutter 获取/获取啥版本的插件?

带有 --androidx 的新 Flutter 项目出现 AndroidX 不兼容错误

带有一个适用于android、ios、web的插件的flutter firebase(实时)数据库? [复制]

Flutter 字节跳动穿山甲广告插件发布 - FlutterAds

Flutter 字节跳动穿山甲广告插件发布 - FlutterAds

Flutter 字节跳动穿山甲广告插件发布 - FlutterAds