代码之家  ›  专栏  ›  技术社区  ›  Daneel

Flatter MissingPluginException包含多个插件

  •  6
  • Daneel  · 技术社区  · 8 年前

    最近我一直在使用一些flutter插件。许多插件都工作得很好,但我多次遇到令人沮丧的错误,通常导致放弃插件。

    这是我得到的最后一个 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 clean , flutter upgrade , flutter packages get 然后 flutter run ". 有时可能已经足够了,但并不总是如此 -在我的特殊情况下,我仍然会得到完全相同的错误。

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

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

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

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

    3. 单击颤振命令 Packages get Packages upgrade 在安卓工作室

    4. 点击弹出窗口 Get packages 当它出现在Android Studio时

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

    6. 换线 import 'package:schedule_notifications_example/time_picker.dart'; 进入 import 'time_picker.dart'; 来解决我从Android Studio收到的错误

    7. 创建一个文件 time_picker.dart 旁边 主要的飞奔 并将来自 https://github.com/serralvo/schedule_notifications/blob/master/example/lib/time_picker.dart

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

    9. 启动颤振控制台,进入我的项目目录

    10. 执行命令 扑干净 , 颤振升级 , 颤振包裹 在控制台里

    11. 执行命令 飞跑 在控制台中,仍然会出现相同的错误

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

    类似问题的例子:

    3 回复  |  直到 8 年前
        1
  •  8
  •   rahulserver    6 年前

    在我的情况下,我(错误地)从 MainActivity.kt (车内) onCreate (钩子)

        GeneratedPluginRegistrant.registerWith(this)
    

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

        2
  •  6
  •   Raj Yadav    7 年前

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

        3
  •  5
  •   cppxaxa    6 年前

    在花了12个小时的持续努力在一个Fatter android项目中解决这个问题之后。。。最终解决-受“@rahulserver”解决方案启发,如下所示

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

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

    注意:main活动扩展了main活动

        4
  •  4
  •   Daneel    8 年前

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

    所以,让 schedule_notifications 插件工作,我必须打开文件 MainActivity.java example project .在那里,我注意到一些我自己的项目中没有的行:

        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);
            }
          }
        });
    

    当我把这些行复制粘贴到我自己的 主要活动。JAVA 文件(通过正确的导入),我的项目终于成功了。

    你会注意到这一点 main.dart ,我们有以下几行:

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

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

    这些都与中的新行相关联 主要活动。JAVA .这就是问题的根源。

    执行这些步骤会使插件工作,但我不确定这是好的还是糟糕的做法。 如果这真的是我们应该做的,我必须说是的 不太明显 ! 我觉得 至少插件安装文档应该对此进行解释 .

        5
  •  4
  •   Jaswant Singh    8 年前

    我也有同样的问题,我花了一段时间才明白为什么会发生这种情况。 解决方案很简单,只需关闭应用程序并运行一个新的应用程序。

        6
  •  1
  •   Md. Sulayman    6 年前

    做一个 flutter clean flutter pub get .在中添加任何插件语句后 pubspec.yaml 文件,你需要做一个 flutter packages get 命令停止运行应用程序,卸载然后重建对我来说很有效。

        7
  •  1
  •   Ben Winding    5 年前

    我通过稍微修改安卓版本来解决这个问题。

    1. 后藤 android/app/build.gradle
    2. 添加以下行:
    android {
    
       // other config stuff here
    
       buildTypes {
           release {
               signingConfig signingConfigs.release
    
               // Add these 2 lines
               minifyEnabled false   
               shrinkResources false
           }
       }
    }
    

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